我正在使用 Nativescript/Angular 2 构建应用程序
我希望能够从 URL 下载文件并将其保存到设备中普通用户可以轻松找到它的位置。我相信在 iOS
和 Android
上,下载都是最好的选择。如果我错了,请纠正我。
文件可以是任何文件类型,而不仅仅是图像。所以主要是电子表格
、word文档
、pdf
、png
、jpg
等。
我已经在网上和文档中进行了搜索。该文档描述了一种称为 getFile 的方法它获取一个文件并将其保存到您的设备。
我在我的代码中实现了如下:
download (id) {
console.log('Download Started');
getFile("https://raw.githubusercontent.com/NativeScript/NativeScript/master/apps/tests/logo.png").then(function (r) {
console.log(r.path);
}, function (e) {
//// Argument (e) is Error!
});
}
问题在于它将它保存到非用户可访问的位置,例如:
/data/user/0/com.myapp.example/files/logo.png
更新:
我也试过直接指定路径:
fs.knownFolders.documents();
但是,此方法获取用户或外部应用程序无法访问的当前应用程序的文档文件夹
最佳答案
经过一些不成功的尝试,我终于找到了如何将文件保存到用户“下载”文件夹(类似于 sdcard/Download)。您可以使用 android.os.Environment 方法获取此文件夹。
将此添加到您的组件中:
import { getFile } from 'tns-core-modules/http';
import * as fileSystem from "tns-core-modules/file-system";
import { isAndroid } from "tns-core-modules/platform";
import { alert } from "tns-core-modules/ui/dialogs";
declare var android;
<...>
public download (url, fileName) {
if (isAndroid) {
const permissions = require("nativescript-permissions");
permissions.requestPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, "I need these permissions because I'm cool")
.then(() => {
let downloadedFilePath = fileSystem.path.join(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName);
getFile(url, downloadedFilePath).then(resultFile => {
alert({
title: 'Saved!',
okButtonText: 'OK',
message: `File saved here:\n${resultFile.path}`
});
}, error => {
alert({
title: 'Error',
okButtonText: 'OK',
message: `${error}`
});
});
});
}
}
还有什么你应该知道的:
1)没有任何下载提示,标准系统下载栏也没有出现,不知如何解决。
2) 对于 iOS 你可以尝试使用
const filePath = fileSystem.path.join(fileSystem.knownFolders.ios.downloads().path, fileName);
getFile(url, filePath).then((resultFile) => {}, (error) => {});
我认为,遗憾的是 NS 文档不直截了当,您不能仅使用 NS 功能将文件保存在用户可访问的位置。我只有在阅读文件/node_modules/tns-core-modules/file-system/file-system.d.ts 中的注释时才弄清楚
希望对你有帮助。
关于http - 从 URL 下载文件到用户可访问的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41125530/