2016-01-22 27 views
0

我有一個表單,可以輸入多個圖像文件。插入時,我可以在服務器上使用Request.Files中的內容恢復它們,然後我將文件作爲byte[]添加到我的模型中,並使用文件名。輸入中的返回文件

我的問題依賴於當我試圖從我的模型中恢復數據,把它放回到編輯窗體中的所有其他值成功回來,但與圖像,我不得不要求他們一個從服務器中取一個,並將其設置爲img標記的src屬性。

當我重新提交我的表單時,我再也沒有Request.Files上的圖像,並且這會導致圖像從我的數據庫中被刪除而不再處於我的模型中,因爲每次我提交插入或編輯,它通過我的方法驗證Request.Files

我該如何保持圖像始終保持在我的表格上,或填寫<input type="file" />

下面是把圖像模型代碼:

private void LoadImages(Modelo.Entidades.Produto.Produto model) 
{ 
    if (Request.Files.Count == 0) 
     return; 

    var indexImages = 0; 

    for (var i = 0; i < Request.Files.Count; i++) 
    { 
     var result = AddImageToModell(model, Request.Files[i], indexImages); 

     if (result) 
      indexImages += 1; 
    } 
} 

private bool AddImageToModell(Modelo.Entidades.Produto.Produto model, HttpPostedFileBase imageFile, int index) 
{ 
    if (imageFile == null || imageFile.ContentLength == 0) 
     return false; 

    model.Images[index].FileName = imageFile.FileName; 

    using (var dest = new MemoryStream()) 
    { 
     Image image = Image.FromStream(imageFile.InputStream); 

     imageFile.InputStream.Seek(0, SeekOrigin.Begin); 

     var resizeQuery = string.Format("width={0}&height={1}&crop={2}&format={3}", image.Width, image.Height, "auto", "png"); 
     ImageBuilder.Current.Build(imageFile.InputStream, dest, new ResizeSettings(resizeQuery)); 

     dest.Seek(0, SeekOrigin.Begin); 

     model.Images[index].Image = new byte[dest.Length]; 
     dest.Read(model.Images[index].Image, 0, model.Images[index].Image.Length); 
    } 

    return true; 
} 

下面是將文件發送到爲img src使用代碼:

public ActionResult Imagem(int idProduto, int item) 
{ 
    var produto = Repositorio.ComCodigo(idProduto); 

    if (produto == null) 
     return NotFound(); 

    var imagem = produto.Imagens.Where(p => p.Item == item).FirstOrDefault().Imagem; 

    if (imagem == null || imagem.Length < 10) 
     imagem = System.IO.File.ReadAllBytes(Server.MapPath("~/Content/imagens/image-uploader-no-image.png")); 

    var stream = new MemoryStream(imagem); 
    stream.Seek(0, SeekOrigin.Begin); 

    return File(stream.ToArray(), "image/png"); 
} 

在此先感謝。

回答

2

無法將單個HTTP響應中的圖像連同MVC視圖的主HTTP響應一起發送,因此您通過設置img tagsrc屬性逐個發送圖像的方法是正確的。

上傳和步驟更新圖像可能是:

  1. 當表單打開,創建一個控制器中的唯一鍵(GUID),並使其成爲一個隱藏字段的形式時,它是打開(所以它仍然是相同的betweem提交表單)

  2. 如果用戶上傳一個新的圖像編輯時的形式,

    • 與GUID一起上傳,保存圖片暫時(數據庫,磁盤),
    • 保存會話,以便用戶看到新的圖像對象有關GUID和正在待保存
    • 更新src標籤指向臨時圖像的臨時文件名信息
  3. 如果用戶提交整個表單之後,從會話收集信息的對象有關根據該GUID新形象,使新的圖像持久性
  4. 添加一個後臺作業的修剪舊的臨時文件