[英]Path.GetFullPath — Return only the last folder, file name and extension
我正在尝试获取Web应用程序中文件的路径,但它返回了我计算机中的路径。
我正在使用mvc 5和ef 6,基本上用户可以上传图片,所有上传的图片都放入〜/ Upload_Files /“当前用户的用户名” /
upload方法将获取当前用户的用户名,如果该文件夹存在,则创建一个并将所有图片上传到该文件夹。
主要的操作方法是显示/ 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; }
}
索引新视图
@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>
}
我认为我的观点是完全错误的。
如果您需要映射目标目录或其子目录中的图像,则建议这样做:
public string ReverseMapPath(string path)
{
string appPath = Server.MapPath("~");
return string.Format("~{0}", path.Replace(appPath, "").Replace("\\", "/"));
}
...
imagesModel.ImageList.Add(ReverseMapPath(item));
基本上, ReverseMapPath
函数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;
}
因此,无论何时上传或更改图像,都应修改表中的值。 这将大大提高应用程序的性能
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.