使用cordova-file-transfer插件download方法返回错误码3,求排查原因
解决Cordova FileTransfer错误码3(CONNECTION_ERR)的问题
首先,错误码3对应的是FileTransferError.CONNECTION_ERR,也就是连接相关的错误,可能是代码逻辑问题,也可能是服务器配置的限制,咱们一步步排查:
先看代码里的几个潜在问题
- 函数名拼写错误:你写的
downlaodMedia多了个a,应该是downloadMedia——虽然这不一定直接导致错误,但容易引发后续调试混乱,先修正过来。 - URL编码方式不对:你用
encodeURI处理了整个URL,但其实只需要编码pathName部分就行(因为URL里的https://等协议部分不需要编码)。如果pathName里包含空格、&、%这类特殊字符,encodeURI的处理不够彻底,建议换成encodeURIComponent单独编码路径部分:var url= "https://www.monsite.com/medias/" + encodeURIComponent(pathName); - 目标路径可能存在格式问题:
cordova.file.DataDirectory已经是标准的文件系统URL(比如cdvfile://localhost/data/),如果pathName开头带斜杠,拼接后会变成cdvfile://localhost/data//xxx.mp3,这种重复斜杠可能导致路径解析失败。建议先清理pathName的多余斜杠:const cleanPathName = pathName.replace(/^\/+/, ''); const file = cordova.file.DataDirectory + cleanPathName; - 请求头可能缺失关键信息:有些服务器会拒绝没有
User-Agent的请求,或者对非浏览器请求做拦截。可以在headers里添加一个模拟移动端的User-Agent:headers: { "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA==", "User-Agent": "CordovaApp/1.0.0 (Mobile)" }
再排查服务器端的配置问题
- 先验证文件是否能正常访问:在浏览器里直接打开
https://www.monsite.com/medias/[你的pathName],看能不能正常下载。如果不行,那肯定是服务器的问题——比如文件权限设置错误、Nginx/Apache的路径配置不对,或者文件本身不存在。 - CORS跨域配置:如果你的App和网站域名不同,服务器需要配置CORS允许跨域请求。需要在响应头里添加:
否则浏览器(Cordova的WebView本质是浏览器)会阻止跨域下载请求。Access-Control-Allow-Origin: * (或者你的App对应的域名) Access-Control-Allow-Methods: GET - HTTPS证书问题:如果你的网站用的是自签名证书,或者证书不被移动系统信任,即使你把
trustAllHosts设为true,Android 7+或iOS的安全机制还是会拒绝连接。这种情况要么换成正规CA签发的证书,要么在Android的network_security_config.xml里配置允许该域名的不安全连接。 - Basic认证是否有效:用Postman或者curl测试一下带Authorization头的请求是否能访问文件,确认账号密码的Base64编码是否正确。
修正后的代码参考
function downloadMedia(pathName) { // 清理pathName开头的多余斜杠 const cleanPathName = pathName.replace(/^\/+/, ''); const targetFile = cordova.file.DataDirectory + cleanPathName; // 正确编码路径部分 const url = "https://www.monsite.com/medias/" + encodeURIComponent(cleanPathName); window.resolveLocalFileSystemURL(targetFile, existingFile, startDownload); function existingFile(fileEntry) { navigator.notification.alert('文件已存在', null, '提示'); } function startDownload() { const fileTransfer = new FileTransfer(); const options = { headers: { "Authorization": "Basic dGVzdHVzZXJuYW1lOnRlc3RwYXNzd29yZA==", "User-Agent": "CordovaApp/1.0.0 (Mobile)" } }; fileTransfer.download( url, targetFile, function(entry) { navigator.notification.alert('下载成功', null, '下载完成'); }, function(error) { console.error('下载错误详情:', error); alert(`下载错误:\n源地址: ${error.source}\n目标地址: ${error.target}\n错误码: ${error.code}\n错误信息: ${error.message}`); }, true, // 测试环境可以开启,生产环境建议关闭并配置合法证书 options ); } }
排查步骤建议
- 先在浏览器测试文件URL的可访问性,排除服务器文件本身的问题;
- 用Postman验证带Authorization头的请求是否有效;
- 修正代码里的拼写、编码、路径问题,添加User-Agent;
- 检查服务器的CORS和HTTPS证书配置。
内容的提问来源于stack exchange,提问作者El Mamoun Lamsahle
相关产品推荐
相关产品推荐

