我正在尝试获取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>
}
我认为我的观点是完全错误的。
答案 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;
}
因此,无论何时上传或更改图像,都应修改表格中的值。这将大大提高您的应用程序的性能