路径.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>
}
我认为我的观点是完全错误的。
如果您需要映射目标目录或其子目录中的图像,那么我建议这样做:
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;
}
因此,无论何时上传或更改图像,都应该修改表中的值。这将大大提高应用程序的性能