Jquery 将MVC bytearray转换为可下载的javascript文件

Jquery 将MVC bytearray转换为可下载的javascript文件,jquery,arrays,ajax,asp.net-mvc,Jquery,Arrays,Ajax,Asp.net Mvc,我设法从MicrosoftMVC获得了一个文件的字节数组、名称和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控制器方法获取数据,该方法为流返回一个字节[],为文件名和mime返回两个字符串 我需

我设法从MicrosoftMVC获得了一个文件的字节数组、名称和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控制器方法获取数据,该方法为流返回一个字节[],为文件名和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 thing)是一个解决MVC错误的方法

GenericResponse是一个通用数据交换类,如下所示:

public class GenericResponse
{
    public bool result { get; set; }
    public object data { get; set; }
}
public class DlModel
{
    public byte[] stream { get; set; }
    public string filename{ get; set; }
    public string mime { get; set; }
}
public static DlModel DlFileAsync(int fileid)
  var dbFileEntry = getFromDb(fileid);
  var ret = new DlModel() {
    filename = dbFileEntry.FileName,
    stream = dbFileEntry.VarBinaryStream
  };
  return ret;
}
public partial class FileStream : EntityGeneric   
{
  public int Id { get; set; }
  public string FileName { get; set; }
  public byte[] VarBinaryStream { get; set; }
}
DlModel是一个用于文件信息交换的类,如下所示:

public class GenericResponse
{
    public bool result { get; set; }
    public object data { get; set; }
}
public class DlModel
{
    public byte[] stream { get; set; }
    public string filename{ get; set; }
    public string mime { get; set; }
}
public static DlModel DlFileAsync(int fileid)
  var dbFileEntry = getFromDb(fileid);
  var ret = new DlModel() {
    filename = dbFileEntry.FileName,
    stream = dbFileEntry.VarBinaryStream
  };
  return ret;
}
public partial class FileStream : EntityGeneric   
{
  public int Id { get; set; }
  public string FileName { get; set; }
  public byte[] VarBinaryStream { get; set; }
}
和FileUtils.DlFileAsync如下所示:

public class GenericResponse
{
    public bool result { get; set; }
    public object data { get; set; }
}
public class DlModel
{
    public byte[] stream { get; set; }
    public string filename{ get; set; }
    public string mime { get; set; }
}
public static DlModel DlFileAsync(int fileid)
  var dbFileEntry = getFromDb(fileid);
  var ret = new DlModel() {
    filename = dbFileEntry.FileName,
    stream = dbFileEntry.VarBinaryStream
  };
  return ret;
}
public partial class FileStream : EntityGeneric   
{
  public int Id { get; set; }
  public string FileName { get; set; }
  public byte[] VarBinaryStream { get; set; }
}
这里dbFileEntry是db记录,文件名为nvarchar(30)类型,VarBinaryStream为varbinary(MAX)。 MVC中对应的实体类如下:

public class GenericResponse
{
    public bool result { get; set; }
    public object data { get; set; }
}
public class DlModel
{
    public byte[] stream { get; set; }
    public string filename{ get; set; }
    public string mime { get; set; }
}
public static DlModel DlFileAsync(int fileid)
  var dbFileEntry = getFromDb(fileid);
  var ret = new DlModel() {
    filename = dbFileEntry.FileName,
    stream = dbFileEntry.VarBinaryStream
  };
  return ret;
}
public partial class FileStream : EntityGeneric   
{
  public int Id { get; set; }
  public string FileName { get; set; }
  public byte[] VarBinaryStream { get; set; }
}

我想差不多就这些了。

它看起来像是
data.stream
应该是
data.data.stream
基于您的对象以及对其他属性引用的使用。这不是已经是一个数组了吗?您不需要将其作为
Blob([data.data.stream],{type:data.data.mime})
传递,而是作为
Blob(data.data.stream,{type:data.data.mime})
传递。这是一个打字错误,每个data.data都是复制粘贴错误,我将在以后编辑并修复它。我还尝试了不在数组中再次包装data.stream,但结果文件中的变化很小:使用该数组,我得到的序列是:137,80,78,71,13,10,10,0,0,0,0,13,73,72,68,82,0,0,0,[…],而不使用逗号时,我得到的序列是1378077113102610000137372688200[…]。这显然不是一个png,我做了一些转换非常错误!请发布返回数据的控制器方法。我补充说,在数据库中,文件正确存储,如果以不同方式恢复,则文件有效。