路径.GetFullPath -只返回最后一个文件夹,文件名和扩展名

本文关键字:文件名 扩展名 文件夹 最后一个 GetFullPath -只 返回 路径 | 更新日期: 2023-09-27 18:14:00

我试图获得web应用程序内文件的路径,但它返回我计算机内的路径。

我使用mvc 5和ef 6,基本上用户可以上传图片,所有上传的图片都在~/Upload_Files/"当前用户的用户名"/

上传方法将获取当前用户的用户名,如果该文件夹存在,则创建一个并将所有图片上传到该文件夹。

主要动作方法是显示/Upload_Files文件夹内的所有图片,包括子文件夹内的图片。

在action方法中:

var imagesModel = new ImageGallery();
var imageFiles = Directory.GetFiles(
    Server.MapPath("~/Upload_Files/"), "*.*", SearchOption.AllDirectories);
foreach (var item in imageFiles)
{
    // imagesModel.ImageList.Add(Path.GetFileName(item));
    imagesModel.ImageList.Add(Path.GetFullPath(item));
}
return View(imagesModel);`

在cshtml内部显示图片

<img src="@Url.Content(image)" width="150" height="150"/>

如果我使用GetFullPath,它将返回我的计算机中的位置,所以图片不会显示。

我尝试了GetFileName,并将字符串的其余部分创建为("~/Upload_Files"+项),如果图片仅存储在Upload_Files文件夹中而不是子文件夹中,则可以工作。也试过用户("~/Upload_Files/" + user。身份等+"/"+项目)等等。有人能给我点建议吗?最近刚开始使用mvc。

也我的主要目标是显示子文件夹内的所有图像,如果用户点击图片,它将只拉出所有的图片为该用户(这只是引用他/她的用户名),最后允许用户删除自己的图片。还有更方便的方法吗?

任何帮助都非常感谢!

上传图片方法

if (Request.Files.Count != 0)
        {
            for (int i = 0; i < Request.Files.Count; i++)
            {
                HttpPostedFileBase file = Request.Files[i];
                int fileSize = file.ContentLength;
                string fileName = file.FileName;
                string user = User.Identity.GetUserName();
                string path = Server.MapPath("~/Upload_Files/" + user + "/");
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                file.SaveAs(Server.MapPath("~/Upload_Files/" + user + "/" + fileName));
                ImageGallery imageGallery = new ImageGallery();
                imageGallery.ID = Guid.NewGuid();
                imageGallery.Name = fileName;
                imageGallery.ImagePath = "~/Upload_Files/" + user + fileName;
                imageGallery.UserId = user;
                db.ImageGallery.Add(imageGallery);
                db.SaveChanges();
            }
            return Content("Success");
        }
        return Content("failed");

索引动作方法

public ActionResult Indexnew()
    {
        var imagesModel = new ImageGallery
        {
            ImagePath = Datalayer.GetImagePaths()
        };
        return View("Indexnew", imagesModel);
    }

ImageGallery类

public class ImageGallery
{
    public ImageGallery()
    {
        ImageList = new List<string>();
    }
    [Key]
    public Guid ID { get; set; }
    public string UserId { get; set; }
    public string Name { get; set; }
    public IEnumerable<string> ImagePath { get; set; }
    public List<string> ImageList { get; set; }
}

Indexnew视图

@model MM5.Models.ImageGallery
@foreach (var image in Model)
            {
                <p>@image</p>
                <a id="ShowImage" title="Photo" href="@Url.Action("Details","ImageGallery", User.Identity.Name)">
                    @*<img src="@Url.Content("~/Upload_Files/" + image. + "/" + image)" width="150" height="150" />*@
                    <img src="@Url.Content(image)" width="150" height="150" />
                </a>
            }

我认为我的观点是完全错误的。

路径.GetFullPath -只返回最后一个文件夹,文件名和扩展名

如果您需要映射目标目录或其子目录中的图像,那么我建议这样做:

public string ReverseMapPath(string path)
{
    string appPath = Server.MapPath("~");
    return string.Format("~{0}", path.Replace(appPath, "").Replace("''", "/"));
}
...
imagesModel.ImageList.Add(ReverseMapPath(item));

基本上,ReverseMapPath函数将给定的文件系统路径转换为应用程序虚拟路径。例如:

D:'Web'MyApp'Upload_Files'User123'Holiday'Italy.jpg

译为

~/Upload_Files/User123/Holiday/Italy.jpg

不知道为什么框架内没有这样的功能

我建议不要从视图内部调用方法。你可以使用

来获取路径映射
var path = Server.MapPath("~/Upload_Files");

你应该传递一个ViewModel给你的视图,包含你所有的图像路径

你应该有一个相对映射,或者已经在IIS上设置了一个虚拟目录,然后使用相对路径并附加它们。您应该将图像目录存储在

目录中。

Web.config

<add key="ImageUrl" value="/Upload_Files/" />

Controller

    public ActionResult Index()
    {
        var homeVm = new HomeVM
        {
            ImagePaths = DataLayer.GetImagePaths()
        };
        return View("Index", homeVm);
    }

ViewModel

    class HomeVM
    {
            public IEnumerable<string> ImagePaths { get; set; }
    }

DataLayer

我建议不要每次都枚举文件,因为这会严重影响应用程序的性能。您应该将图像的url存储在数据库中,并执行类似

的操作。
    public static IEnumerable<string> GetImagePaths()
    {
        var imageUrl = ConfigurationManager.AppSettings["ImageUrl"];
        var db = new MyDataClassDataContext();
        var value = (from im in db.Images select imageUrl + im.Path).ToList();
        db.Dispose();
        return value;
    }

因此,无论何时上传或更改图像,都应该修改表中的值。这将大大提高应用程序的性能