Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.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 如何使用js在iOS中正确下载自定义名称的pdf文件?_Javascript_Jquery_Ios_Iphone_Ipad - Fatal编程技术网

Javascript 如何使用js在iOS中正确下载自定义名称的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中发生。下面是我在

我正在尝试使用jQuery将pdf文件从服务器响应下载到客户端。我的代码在Chrome和Mozilla上适用于Windows、Android和Linux,即能够下载具有正确名称的pdf数据文件并能够打开它。
但在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谢谢,如果需要跨平台工作,这似乎是唯一可能的解决方案。很高兴看到可行的解决方案。