Jquery 将MVC bytearray转换为可下载的javascript文件
我设法从MicrosoftMVC获得了一个文件的字节数组、名称和mimetype。我从使用jQuery进行的Ajax调用中获取该数据,并在控制台中获取以下数据: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返回两个字符串 我需
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,我做了一些转换非常错误!请发布返回数据的控制器方法。我补充说,在数据库中,文件正确存储,如果以不同方式恢复,则文件有效。