Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以C#作为BLOB打开文件,以JS作为BLOB下载_Javascript_C#_Ajax_Download_Blob - Fatal编程技术网

Javascript 以C#作为BLOB打开文件,以JS作为BLOB下载

Javascript 以C#作为BLOB打开文件,以JS作为BLOB下载,javascript,c#,ajax,download,blob,Javascript,C#,Ajax,Download,Blob,我的.NETCore服务器上有一个PDF文件,我需要以某种方式将其作为BLOB发送,这样我的JS AJAX请求就可以将其转换回PDF文件,以便下载 间接寻址的原因是文件来自我的API,它只能通过AJAX访问。由于需要承载令牌,我不能只在后台使用表单,因为创建的站点没有cookie。(奇怪,我知道,但这就是目前的情况,我不想改变这一部分) 因此,在我的C#端,我尝试了几种变体,如下所示ApiResponse只是我使用的一个容器,它包含一个bool和一个string(名为message)以便我可以判

我的.NETCore服务器上有一个PDF文件,我需要以某种方式将其作为BLOB发送,这样我的JS AJAX请求就可以将其转换回PDF文件,以便下载

间接寻址的原因是文件来自我的API,它只能通过AJAX访问。由于需要承载令牌,我不能只在后台使用表单,因为创建的站点没有cookie。(奇怪,我知道,但这就是目前的情况,我不想改变这一部分)

因此,在我的C#端,我尝试了几种变体,如下所示
ApiResponse
只是我使用的一个容器,它包含一个
bool
和一个
string
(名为
message
)以便我可以判断请求是否正确

这就是我一直在尝试的

return new ApiResponse(true, File.ReadAllText(path));
return new ApiResponse(true, Convert.ToBase64String(File.ReadAllBytes(path)));
return new ApiResponse(true, JsonConvert.SerializeObject(File.ReadAllBytes(path)));
在JS方面,按照解析它的相同顺序,我有:

// Get the response in object form, since it's sent as an ApiResponse
const response = JSON.parse(xmlhttp.response);

const text = response.message;
const text = atob(response.message)
const text = JSON.parse(response.message)
我也试过类似的方法

const text = atob(JSON.parse(response.message))
然后,通过文本,我将这样做:

const blob = new Blob([text], {type: "application/pdf"});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "file.pdf";

document.body.appendChild(a);
a.click();
这会正确地生成一个下载的文件。但是,该文件无效:它已损坏

在这一点上我几乎被卡住了,而且我还没有找到使用这种方法从开始到结束使用Javascript下载文件的方法。它要么是背面,要么是正面,但从来没有绑在一起


那么,我如何才能成功地通过网络发送PDF BLOB,并在前端重新创建它以便下载?

如何进行转换的简单答案是不要

每个现代浏览器都支持base64本机编码,因此无需在下载数据之前将数据转换回BLOB

因此,最终代码为:

const a = document.createElement("a");
a.href = "data:application/pdf;base64," + response.message;
a.download = "file.pdf";

document.body.appendChild(a);
a.click();