【发布时间】:2018-08-23 11:35:35
【问题描述】:
在我的 javascript 客户端中,我使用 fetch 调用服务器来检索服务器生成的文件。我正在使用以下客户端代码:
var _url = "";
var initParms = {
method: "GET",
mode: 'cors'
}
fetch(_url, initParms)
.then(response => {
if(response.ok){
alert(response.headers.get("content-disposition"));
return response.blob();
}
throw new Error("Network response was not OK.");
})
.then(blob => {
var url = new URL.createObjectURL(blob);
})
这实际上工作得很好。但是,服务器会为该文件生成一个文件名,并将其作为 content-disposition 标头的一部分包含在响应中。
我需要使用服务器生成的文件名将此文件保存到用户的机器上。在 Postman 中,我实际上可以看到响应的内容处置标头设置为:Content-Disposition: attachment;filename=myfilename.txt。
我尝试从响应中读取内容处置(请参阅我的 js 代码中的警报),但我总是得到 null(即使相同的响应显示 Postman 中的内容处置)。
我做错了吗?有没有办法使用 fetch 响应来检索文件名?有没有更好的方法从服务器获取文件名以及文件?
附:这是我返回文件的服务器端代码:
控制器动作
public IHttpActionResult GetFile(){
return new FileResult("myfilename.txt","Hello World!");
}
文件结果类
public class FileResult : IHttpActionResult
{
private string _fileText = "";
private string _fileName = "";
private string _contentType = "";
public FileResult(string name, string text)
{
_fileText = text;
_fileName = name;
_contentType = "text/plain";
}
public Task<HttpResponseMessage> ExecuteActionAsync(CancellationToken token)
{
Stream _stream = null;
if (_contentType == "text/plain")
{
var bytes = Encoding.Unicode.GetBytes(_fileText);
_stream = new MemoryStream(bytes);
}
return Task.Run(() =>
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(_stream),
};
response.Content.Headers.ContentType =
new MediaTypeHeaderValue(_contentType);
response.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment")
{
FileName = _fileName
};
return response;
}, token);
编辑
我的问题是关于 fetch 而不是 ajax api。此外,在我的代码中,我表明我已经在从响应中读取标题,就像在建议的答案中展示的接受的答案一样。但是,正如我在帖子中所述,此解决方案不适用于 fetch。
【问题讨论】:
-
不同之处在于我询问的是 fetch api 而不是 ajax api。另请注意,我已经在执行已接受答案中建议的操作,但它不起作用。
标签: javascript fetch-api