将MVC字节数组转换为可下载的javascript文件

时间:2020-02-13 20:54:27

标签: jquery arrays ajax asp.net-mvc

我设法从Microsoft MVC获取文件的字节数组,名称和mimetype。我从使用jQuery进行的Ajax调用中获取了这些数据,并在控制台中获取了以下数据:

data: {
  stream: [68, 82, 0, 0, 4, 57, 0, 0, 7, 179, 8, 6, 0, 0,…],
  filename: "testFile.png",
  mime: "image/png"
}

我通过MVC控制器方法获取该数据,该方法返回流的byte []和文件名和mime的两个字符串。

我需要将此流js端作为文件供用户下载。我看到了许多涉及Blob对象的方法,但仍然无法获得正确的文件。我得到一个较大的文件,例如,一个png图像,但下载的版本无效,因此无法打开。 这是我实现目标的尝试:

[...]
$.ajax({
  url: myUrlToControllerMethod, 
  type: 'POST', 
  data: { fileid: myFileId},
  success: function (res) {
    var a = document.createElement('a');
    var blob = new Blob(res.data.stream, { type: res.data.mime });
    console.warn(blob)
    const url = URL.createObjectURL(blob);
    console.info(url)
    a.href = url;
    a.download = res.data.filename;
    document.body.append(a);
    a.click();
    window.URL.revokeObjectURL(url);
  },
[...]

我在哪里错了?

编辑:我添加了控制器方法:

public JsonResult DlFileAsync(int fileid)
{
  var ute = GetUtente();
  DlModel result = FileUtils.DlFileAsync(fileid);
  result.mime = MimeMapping.GetMimeMapping(result.nomefile);
  var jsonResult =  Json(new GenericResponse(true, result), JsonRequestBehavior.AllowGet);
  jsonResult.MaxJsonLength = int.MaxValue;
  return jsonResult;
}

其中:最后三行(jsonResult内容)是针对学到的here的MVC错误的解决方法。

GenericResponse是如下的通用数据挖掘类:

public class GenericResponse
{
    public bool result { get; set; }
    public object data { get; set; }
}

DlModel是用于文件信息交换的类,如下所示:

public class DlModel
{
    public byte[] stream { get; set; }
    public string filename{ get; set; }
    public string mime { get; set; }
}

FileUtils.DlFileAsync如下:

public static DlModel DlFileAsync(int fileid)
  var dbFileEntry = getFromDb(fileid);
  var ret = new DlModel() {
    filename = dbFileEntry.FileName,
    stream = dbFileEntry.VarBinaryStream
  };
  return ret;
}

此处dbFileEntry是db记录,其FileName具有nvarchar(30)类型,而VarBinaryStream具有varbinary(MAX)类型。 MVC中对应的实体类如下:

public partial class FileStream : EntityGeneric   
{
  public int Id { get; set; }
  public string FileName { get; set; }
  public byte[] VarBinaryStream { get; set; }
}

我认为几乎是全部。

0 个答案:

没有答案
相关问题