2017-02-21 62 views
0

因此,我正在尝试创建显示保存在某个文件夹中的图像的应用程序。每个用户在C驱动器上都有一个不同的文件夹,从中可以从中获取图像。从C路径显示图像或更改虚拟路径指向的位置

目前我使用:

@foreach (var imgPath in Directory.GetFiles("C:/Users/me/documents", "*.*")) 
{ 
    var img = new FileInfo(imgPath); 
    <img src="@Url.Content(String.Format("C:/Users/me/documents/{0}", img.Name))" /> 
} 

然而,这并不显示,因为C路径的形象,但网上淘使我比别人无处其他说你可以做一个虚拟路径,并指出它到一个物理的,但我找不到教程。

我也想让me部分变量,因为每个用户都有自己的文件夹,但我不确定这是否可以在控制器中处理。

+0

你的文件夹需要是相对/虚拟路径(使用'Server.MapPath()'),'me'可以根据用户的ID生成。 –

+0

@StephenMuecke我有这种感觉,但是我怎样才能将虚拟路径映射到物理路径呢?如果我在Visual Studio中创建一个新文件夹,它会自动创建它的路径。 –

+0

首先在应用程序中为文件创建一个文件夹,称为“用户”。那么对于每个用户,您可以通过编程方式添加基于唯一标识的子文件夹(可能在注册时)。然后你可以使用Server.MapPath()获取文件夹的绝对路径--Server.MapPath(“〜/ Users/User1”)' –

回答

1

Url.Content帮助程序方法为您的文件提供虚拟内容路径并返回一个url来访问您网站中的文件。您不应该将物理目录位置传递给该位置。

您可能会考虑将图像保存在您的网络应用程序中。创建一个名为“Images”的目录,然后你可以安全地使用Url.Content方法。

例如,

@foreach (var imgPath in Directory.GetFiles(Server.MapPath(Url.Content("~/Images/")))) 
{ 
    <img src="@Url.Content("~/Images/"+ @Path.GetFileName(imgPath))" /> 
} 

,或者如果你确实需要在一些地方保存应用程序根目录外的图像(例如:“C:\ TEMP \图像或网络位置),你可能会考虑创建一个这需要的文件名操作方法,从位置读取该文件,并返回为图像。

public ActionResult GetImg(string id) 
{ 
    var path = [email protected]"C:\temp\images\{id}.png"; 
    var bytes = System.IO.File.ReadAllBytes(path); 
    return File(bytes, "image/png"); 
} 

现在,你只需要调用这个终点,并用其作为图像的src属性。

@foreach (var imgPath in Directory.GetFiles(@"C:\temp\images", "*.*")) 
{ 
    <img src="@Url.Action("GetImg",new {id=Path.GetFileNameWithoutExtension(imgPath)})" /> 
} 

以上是一个简单的解决方案,我硬编码它返回PNG文件。你可以更新它以更灵活(增加一个参数来接受文件扩展名)

注意:我个人更喜欢在剃须刀文件中保留最小的C#。我喜欢将C#代码(所有这些Directory.GetFiles行)移动到GET操作,并通过视图模型/视图包(根据需要)将图像名称列表传递到视图。