Path.GetFullPath - 仅返回最后一个文件夹,文件名和扩展名

时间:2015-09-21 19:14:57

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 asp.net-mvc-5

我正在尝试获取Web应用程序中文件的路径,但它会返回计算机中的路径。

我使用的是mvc 5和ef 6,基本上用户可以上传图片,所有上传的图片都进入〜/ Upload_Files /“当前用户的用户名”/

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

主要操作方法是显示/ Upload_Files文件夹中包含子文件夹内的所有图片。

这是在该行动方法中:

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”+ item),如果图片仅存储在Upload_Files文件夹中而不存储在子文件夹中,则可以使用。还试过用户(“〜/ Upload_Files /”+ User.Identity等+“/”+项目)等。有人可以给我一个关于此的想法吗?刚刚开始使用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 View

@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>
            }

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

2 个答案:

答案 0 :(得分:2)

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

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

只是想知道为什么这个功能在框架内部不存在。

答案 1 :(得分:1)

我建议不要在视图中调用方法。但是,您可以使用

获取路径映射
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;
    }

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