返回输入中的文件

本文关键字:文件 输入 返回 | 更新日期: 2023-09-27 18:31:29

>我有一个表格,我可以在其中输入多个图像文件。插入时,我可以在服务器上使用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");
}

提前谢谢。

返回输入中的文件

不可能将

图像与 MVC 视图的主 HTTP 响应一起发送,因此通过设置 img tagsrc 属性逐个发送图像的方法是正确的。

上传和更新映像的步骤可以是:

    打开窗体时
  1. ,在控制器中创建一个唯一键 (GUID),并在打开窗体时将其设置为窗体中的隐藏字段(因此在提交窗体之间保持不变)

  2. 如果用户在编辑表单时上传新图像,

    • 将其与 GUID 一起上传,暂时保存图像(保存到数据库、磁盘),
    • 保存到会话对象信息 有关 GUID 和挂起保存的临时文件名
    • 更新 src 标记以指向临时映像,以便用户看到新映像
  3. 如果用户之后提交整个表单,则根据 GUID 从 Session 对象收集有关新图像的信息,使新图像持久化
  4. 添加用于修剪旧临时文件的后台作业