我们有一个使用 Angular 7 和 Ionic 4 开发的移动应用程序。不久前我们进行了渗透测试,为了合规,我们更改了应用程序中文件传输的方式。我们没有直接通过 API 获取文件 url,而是收到一个内容类型为
application/octet-stream
的 url,然后使用以下方法下载文件并将其保存到设备存储中:
downloadFileTransfer(url, fileName) {
const directoryPath = this.device.platform === 'Android' ? this.file.dataDirectory : this.file.documentsDirectory;
const filePath = directoryPath + fileName;
alert("url:" + url);
alert("filePath:" + filePath);
this.nativeHTTP.downloadFile(encodeURI(url), {}, {}, filePath).then(response => {
this.appService.toastTipSuccess('success: ' + response, false);
alert('response: ' + JSON.stringify(response));
}).catch(err => {
this.appService.toastTip('failure: ' + err, false);
});
}
在真实的 Android 设备上使用此代码,我可以很好地看到 url 和 filePath 被发出警报,并且 downloadFile 回调后的响应警报可以通过包含该文件实际路径的
response
对象触发。保存于。然而,检查设备存储后,尽管响应回调成功触发,但设备中实际上没有保存任何内容。
顺便说一句,这是许多其他替代方案失败后的最新尝试:
saveAs
,createObjectURL
,fileTransfer.download
。尽管其中许多方法可以在网络浏览器中工作,但没有一个可以在真正的移动设备上的独立应用程序中工作。
任何见解或帮助将不胜感激,因为这个问题已经困扰我们的团队几个星期了。
可能有不同的原因,即使清单中没有权限也会影响您保存文件检查的方式Android权限
检查您是否在 Manifest 上拥有这些权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
您使用的是 Cordova 还是电容器?
我以前是用Cordova开发的,由于一些插件过时,不得不迁移到Capacitor,而且也和文件管理有关。
新版本的 Android 已升级安全性,因此,如果您拥有 Android 手机,则 Android 可能不允许,具体取决于您保存的位置 < 10 available, try testing if the file is saved in your desired folder, if it does, your problem is with permissions.
您是否尝试过 FileSystem 等 Ionic 插件来管理此文件? 文件系统
致以诚挚的问候,希望它对您的问题有所帮助。