http - 从 URL 下载文件到用户可访问的位置

标签 http angular typescript nativescript angular2-nativescript

我正在使用 Nativescript/Angular 2 构建应用程序

我希望能够从 URL 下载文件并将其保存到设备中普通用户可以轻松找到它的位置。我相信在 iOSAndroid 上,下载都是最好的选择。如果我错了,请纠正我。

文件可以是任何文件类型,而不仅仅是图像。所以主要是电子表格word文档pdfpngjpg等。

我已经在网上和文档中进行了搜索。该文档描述了一种称为 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/

相关文章:

http - 带有 a/in 的查询字符串有效吗?

Android的proxy混淆文档资源

javascript - 如何在Angular2中观察第三方事件?

angular - 模拟 <select> 元素中的选择

javascript - Raven 不使用 Sentry 中的源映射来处理 TS/JS 代码

typescript - 如何在 typescript 中区分具有相同结构的不同异常/类

javascript - 如何在不显示原始引荐来源网址的情况下进行重定向?

rest - 有效请求但空数据的正确 REST 响应代码是什么?

angular - 如何跳过 *ngFor 中的第一项和最后一项

javascript - 如何从该 API 获取值?