所以我有这个奇怪的问题,我试图显示我从我的网络API收到的pdf,但pdf在Chrome的新浏览器标签中显示为空白(IE显示什么,但它是console.logs ajax成功回调)。
API将其发送回我的ajax请求,如下所示:
public async Task<HttpResponseMessage> GetPdf(PdfModel model)
{
var pdf = await _pdfManager.GetPdfAsync(model);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new ByteArrayContent(pdf);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "MyPdf.pdf";
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return response;
}
这是GetPdfAsync方法,它调用另一个API来获取pdf。当我使用Postman使用相同的模型调用api时,我会得到一个显示为响应的PDF,所以我知道它工作正常。
public async Task<byte[]> GetPdfAsync(PdfModel, CancellationToken ct = new CancellationToken())
{
using (var client = new HttpClient())
{
client.BaseAddress = PdfGeneratorApiUrl;
var content = JsonConvert.SerializeObject(model);
const string endpoint = "myPdf/pdf";
var response = await client.PostAsync(endpoint, new StringContent(content, Encoding.UTF8, "application/json"), ct);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsByteArrayAsync();
}
else
{
return null;
}
}
}
在我的ajax调用中,这就是我试图显示它的方式,但是当我在新选项卡中打开pdf时,它会显示一个空白的pdf,其中包含我在ajax成功时给出的文件名。虽然在console.log中blob.size = 1053248。
$.ajax({
url: '/n/api/getPdf',
type: 'POST',
contentType: 'application/json',
responseType: 'arraybuffer',
data: JSON.stringify(getPdfRequest),
success: function (data) {
var blob = new Blob([data]);
console.log(blob.size);
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="MyPdf.pdf";
link.click();
},
error: function (data) {
console.log(data);
}
});