2012-03-03 82 views
1

我试图显示我以前在视图中加载的图像,但没有成功。 图片上传,这是肯定的。到目前为止,我已经写了这样的事情:保存/检索图像。 ASP.NET MVC

@if(Model.AttachedInformation.Count > 0) 
{ 
    <div id="gallery"> 
     @foreach(var path in Model.AttachedInformation) 
     { 
      <img src="@path" alt="default_description" title="some_title" /> 
     } 
    </div> 
} 

AttachedInformation只是一个ICollection<String>对象。

但这只给我图像的边界。此外,我检查了@path变量,它确实保留了完整的文件路径。

建议感激! 谢谢!

编辑:CONTROLLER

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Employee employee, IEnumerable<HttpPostedFileBase> files) 
{ 
    if(ModelState.IsValid) 
    { 
     var filepath = String.Empty; 

     foreach(var file in files) 
     { 
      if(null != file && file.ContentLength > 0) 
      { 
       filepath = Path.Combine(
        HttpContext.Server.MapPath("~/Content/Images/Uploads"), 
        Path.GetFileName(file.FileName) 
       ); 
       file.SaveAs(filepath); 
       employee.AttachedInformation.Add(filepath); 
      } 
     }     

     this.repository.Add(employee); 

     return Redirect("/"); 
    } 
    else 
    { 
     return View(employee); 
    } 
} 

模型

AbstractEntity保持VersionID性能。

[Serializable] 
public class Employee : AbstractEntity<Employee>, IAggregateRoot 
{ 
    public Employee() 
    { 
     this.AttachedInformation = new HashSet<String>(); 
    } 

    public virtual String FirstName { get; set; } 
    public virtual String MiddleName { get; set; } 
    public virtual String LastName { get; set; } 
    public virtual String SSN { get; set; } 
    public virtual String EmployeeNumber { get; set; } 
    public virtual String TradeUnionNumber { get; set; } 
    public virtual String Department { get; set; } 
    public virtual String Post { get; set; } 
    public virtual DateTime DateOfHire { get; set; } 
    public virtual DateTime DateOfBirth { get; set; } 
    public virtual ICollection<String> AttachedInformation { get; set; } 
} 

VIEW

视图包含多个input s的名字files像:

<input type="file" name="files" id="additional" class=" " accept="image/jpeg,image/png,image/gif" /> 

RAW HTML

<div id="gallery"> 
    <img src="D:\Programming.Projects\BOA\branches\BOA.PresentationLayer\Content\Images\Uploads\Desert.jpg" alt="default_description" title="some_title" /> 
    <img src="D:\Programming.Projects\BOA\branches\BOA.PresentationLayer\Content\Images\Uploads\Hydrangeas.jpg" alt="default_description" title="some_title" /> 
    <img src="D:\Programming.Projects\BOA\branches\BOA.PresentationLayer\Content\Images\Uploads\Jellyfish.jpg" alt="default_description" title="some_title" /> 
    <img src="D:\Programming.Projects\BOA\branches\BOA.PresentationLayer\Content\Images\Uploads\Koala.jpg" alt="default_description" title="some_title" /> 
</div> 

BOUNTY

我需要的是得到一个说明的例子(工程)。谢谢!

+1

“真的保留完整的文件路径”在'file:///'路径中吗?或者路径实际上在浏览器中工作? – EAMann 2012-03-03 00:42:38

+2

请提供该功能的HTML输出...(或者当您转到页面时可能会出现一些错误?) – debracey 2012-03-03 00:44:09

+0

您是否可以添加一个控制器来显示如何填充模型? – 2012-03-03 00:45:16

回答

1

好的。我找到了解决方案。也许这对别人有用。

var directory = "/Content/Images/Uploads/" + employee.SSN; 
var path = String.Empty; 

if(!Directory.Exists(Server.MapPath(directory))) 
{ 
    Directory.CreateDirectory(Server.MapPath(directory)); 
} 

foreach(var file in files) 
{ 
    if(null != file && file.ContentLength > 0) 
    { 
     path = Path.Combine(directory + "/", Path.GetFileName(file.FileName)); 
     file.SaveAs(Server.MapPath(path)); 
     employee.AttachedInformation.Add(path); 
    } 
} 

这对我很有用。更正赞赏。

+0

SSN不是唯一的......他们的SSN也将位于每个代理服务器文件夹中。不安全。如果你必须使用SSN,那么至少要散列它如何随机字符串 – ggonsalv 2012-03-06 18:38:00

+0

好的,谢谢!请参阅..使用'Id'非常复杂,因为它会在实体保存到存储库时生成。 – lexeme 2012-03-06 20:07:22

+1

不,我的意思是计算一个单向散列将SSN转换为其他东西.. http://stackoverflow.com/questions/5264644/how-to-obtain-one-way-hash-for-given-string-in -net – ggonsalv 2012-03-08 05:03:07

4
HttpContext.Server.MapPath("~/Content/Images/Uploads") 

上面将给你磁盘上的完整路径,然后你将其保存到员工记录。您应该保存文件的名称,然后将图像采集到〜/ Content/Images/Uploads/

另一个需要注意的是,您将通过文件名将所有图像保存到同一个目录中。如果两个用户上传同名的文件,则会覆盖另一个文件。每位员工都应该有自己的上传目录,否则应该动态生成文件名。

+0

同意!特别是关于覆盖。所以我可能会添加id作为路径的一部分,所以它会是独一无二的!你能否说明你的〜/内容/图片/上传/'? – lexeme 2012-03-03 07:43:35

+2

为了防止大量的子目录,我们还使用了GUID文件名(以及为了显示目的保存上传的文件名)。这样,我们拥有唯一的存储文件名,但可以呈现用户上载的名称,并避免(主要)在存储到磁盘时冲突文件名。我的2美分:) – Tommy 2012-03-03 16:43:57