Javascript 如何使用js在iOS中正确下载自定义名称的pdf文件?
我正在尝试使用jQuery将pdf文件从服务器响应下载到客户端。我的代码在Chrome和Mozilla上适用于Windows、Android和Linux,即能够下载具有正确名称的pdf数据文件并能够打开它。Javascript 如何使用js在iOS中正确下载自定义名称的pdf文件?,javascript,jquery,ios,iphone,ipad,Javascript,Jquery,Ios,Iphone,Ipad,我正在尝试使用jQuery将pdf文件从服务器响应下载到客户端。我的代码在Chrome和Mozilla上适用于Windows、Android和Linux,即能够下载具有正确名称的pdf数据文件并能够打开它。但在Safari和Chrome中的iOS设备(iphone、ipad等)上,可以使用“文档”名称获得文件下载弹出窗口,而不是我在代码中指定的名称。此外,文件保存时不带任何扩展名,并添加了此标题-内容处置:附件;filename=“MyFileName.ext”这些都只在iOS中发生。下面是我在
但在Safari和Chrome中的iOS设备(iphone、ipad等)上,可以使用“文档”名称获得文件下载弹出窗口,而不是我在代码中指定的名称。此外,文件保存时不带任何扩展名,并添加了此标题-
内容处置:附件;filename=“MyFileName.ext”
这些都只在iOS中发生。下面是我在iOS中下载pdf文档时使用的代码
var reader = new FileReader();
var parsedData = JSON.parse(response);
var parsedResult = _base64ToArrayBuffer(parsedData[0])
var blobOutput = new Blob([parsedResult], { type: 'application/pdf' });
var documentLink = document.createElement('a');
documentLink.style = "display: none";
reader.onload = function (e) {
documentLink.href = reader.result;
documentLink.download = parsedData[2]; // contains file name
document.body.appendChild(documentLink);
documentLink.click();
}
reader.readAsDataURL(blobOutput);
是browserstack的iOS 13设备上的屏幕截图。
还检查了苹果已经修复了这个bug,但我无法让它工作
在此方面的任何帮助都将不胜感激。提前谢谢 最后,我删除了从服务器获取响应的所有客户端代码,并对问题中发布的接收到的响应执行操作,并添加了服务器端文件下载和asp.net的FileContentResult。
下面是允许在大多数PlatoRM上下载文件的代码snipet。
我个人在Windows、Android、Linux、MacOS、Chrome和Firefox浏览器以及iOS(Safari)浏览器上进行了测试,它下载的pdf文件的名称和扩展名正确无误。
在iOS Chrome上下载是一场噩梦,它似乎无法强制下载。我试过了,但是弹出的可下载文件的正确名称给了我“无法下载”错误,因此打开了可以在iOS Chrome设备上打印的文件。
使用application/octet强制客户端下载文件
[HttpGet]
public FileResult ProccessCertificate(string val)
{
var result = obj.CertificateService(val); //api call to fetch data
byte[] data = Convert.FromBase64String(result[0]); //this contains pdf data
string contentType = System.Net.Mime.MediaTypeNames.Application.Octet;
List<string> iDevices = new List<string> { "iPad", "iPhone", "iPod" };
var agent = Request.UserAgent;
//if its an iOS device used with chrome browser - open as pdf, as download fails on iOS Chrome
if (iDevices.Any(val => agent.IndexOf(val, StringComparison.OrdinalIgnoreCase) > 0) && agent.IndexOf("Crios", StringComparison.OrdinalIgnoreCase) > 0)
{
contentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
}
return File(data, contentType, result[2]); //last param contain downloadfilename
}
[HttpGet]
公共文件结果进程证书(字符串val)
{
var result=obj.CertificateService(val);//获取数据的api调用
byte[]data=Convert.FromBase64String(结果[0]);//这包含pdf数据
字符串contentType=System.Net.Mime.MediaTypeNames.Application.Octet;
List iDevices=新列表{“iPad”、“iPhone”、“iPod”};
var-agent=Request.UserAgent;
//如果是与chrome浏览器一起使用的iOS设备-以pdf格式打开,则在iOS chrome上下载失败
if(iDevices.Any(val=>agent.IndexOf(val,StringComparison.OrdinalIgnoreCase)>0)和&agent.IndexOf(“Crios,StringComparison.OrdinalIgnoreCase)>0)
{
contentType=System.Net.Mime.MediaTypeNames.Application.Pdf;
}
返回文件(数据、内容类型、结果[2]);//最后一个参数包含downloadfilename
}
请检查SO ans以查看服务器端方法。HTTP响应头内容配置:附件;filename=“MyFileName.ext”
仅当文件直接从服务器获得服务,而不是通过ajax
的成功处理程序和随后的
标记创建时才会出现在图片中。@vijayP谢谢,如果需要跨平台工作,这似乎是唯一可能的解决方案。很高兴看到可行的解决方案。