- 版本:4.2.1
- GitHub:
- NPM: https://npmjs.net.cn/package/nativescript-background-http
- 下载
- 昨天: 156
- 上周: 180
- 上个月: 372
Background Upload NativeScript 插件
一个跨平台的 NativeScript 框架 插件,为 iOS 和 Android 提供后台上传功能。
存在一个原生的 NativeScript http
模块,它可以处理字符串和 JSON 的 GET/POST 请求。然而,在处理大型文件时,其功能相对有限。
该插件使用 iOS 的NSURLSession与后台会话配置;以及 gotev/android-upload-service 库的一个分支,用于 Android。
安装
tns plugin add nativescript-background-http
使用
以下代码片段演示了如何使用 nativescript-background-http
上传单个或多个文件。
上传文件
配置上传会话的示例代码。每个会话必须有一个唯一的 id
,但它可以同时运行多个任务。在创建会话时(如下面的代码中的 image-upload
字符串)传递该 id
。
// file path and url
var file = "/some/local/file/path/and/file/name.jpg";
var url = "https://some.remote.service.com/path";
var name = file.substr(file.lastIndexOf("/") + 1);
// upload configuration
var bghttp = require("nativescript-background-http");
var session = bghttp.session("image-upload");
var request = {
url: url,
method: "POST",
headers: {
"Content-Type": "application/octet-stream"
},
description: "Uploading " + name
};
对于单个文件上传,使用以下代码
var task = session.uploadFile(file, request);
对于多个文件或要传递其他数据,请使用多部分上传方法。所有参数值都必须是字符串
var params = [
{ name: "test", value: "value" },
{ name: "fileToUpload", filename: file, mimeType: "image/jpeg" }
];
var task = session.multipartUpload(params, request);
为了成功上传,必须注意以下事项
- 文件必须可以从您的应用中访问。这可能需要额外的权限(例如,访问设备上的文档和文件)。通常这不会成问题 - 例如,如果您使用另一个插件选择文件,该插件已经添加了所需的权限。
- URL 不应被操作系统阻止。Android Pie 或更高版本默认要求 TLS(HTTPS)连接,并且不会上传到不安全的(HTTP)URL。
上传请求和任务 API
请求对象参数具有以下属性
名称 | 类型 | 描述 |
---|---|---|
url | 字符串 |
请求 URL(例如,https://some.remote.service.com/path )。 |
method | 字符串 |
请求方法(例如,POST )。 |
headers | 对象 |
用于指定额外的头。 |
description | 字符串 |
用于帮助在本地识别上传任务 - 不会发送到远程服务器。 |
utf8 | 布尔值 |
(仅限 Android/仅限多部分) 如果为 true,则将多部分请求的字符集设置为 UTF-8。默认为 false。 |
androidDisplayNotificationProgress | 布尔值 |
(仅限 Android) 用于设置是否显示进度通知。请注意,由于 API26,Android 要求在运行后台任务时使用通知。https://android-docs.cn/about/versions/oreo/background |
androidNotificationTitle | 字符串 |
(仅限 Android) 用于设置 Android 通知中心中显示的标题。 |
androidAutoDeleteAfterUpload | 布尔值 |
(仅限 Android) 用于设置在上传后是否自动删除文件。 |
androidMaxRetries | 数字 |
(仅限Android) 用于设置最大重试次数。默认重试次数为0。https://github.com/gotev/android-upload-service/wiki/Recipes#backoff |
androidAutoClearNotification | 布尔值 |
(仅限Android) 用于设置是否在上传完成后自动清除通知。默认为false。请注意,将此设置为true将同时禁用铃声。 |
androidRingToneEnabled | 布尔值 |
(仅限Android) 用于设置在上传完成后是否播放铃声。默认为true。请注意,当androidAutoClearNotification 设置为true时,此标志将没有效果。 |
androidNotificationChannelID | 字符串 |
(仅限Android) 用于设置通知的通道ID。 |
任务对象具有以下属性和方法,可以用来获取上传信息
名称 | 类型 | 描述 |
---|---|---|
upload | 数字 |
已上传的字节数。 |
totalUpload | 数字 |
要上传的总字节数。 |
status | 字符串 |
以下之一:error 、uploading 、complete 、pending 、cancelled 。 |
description | 字符串 |
用于创建上传任务的请求中设置的描述。 |
cancel() | void |
调用此方法以取消正在进行的上传。 |
处理上传事件
在创建上传任务后,您可以使用以下事件来监控其进度
task.on("progress", progressHandler);
task.on("error", errorHandler);
task.on("responded", respondedHandler);
task.on("complete", completeHandler);
task.on("cancelled", cancelledHandler); // Android only
每个事件处理程序将接收一个带有事件参数的单个参数
// event arguments:
// task: Task
// currentBytes: number
// totalBytes: number
function progressHandler(e) {
alert("uploaded " + e.currentBytes + " / " + e.totalBytes);
}
// event arguments:
// task: Task
// responseCode: number
// error: java.lang.Exception (Android) / NSError (iOS)
// response: net.gotev.uploadservice.ServerResponse (Android) / NSHTTPURLResponse (iOS)
function errorHandler(e) {
alert("received " + e.responseCode + " code.");
var serverResponse = e.response;
}
// event arguments:
// task: Task
// responseCode: number
// data: string
function respondedHandler(e) {
alert("received " + e.responseCode + " code. Server sent: " + e.data);
}
// event arguments:
// task: Task
// responseCode: number
// response: net.gotev.uploadservice.ServerResponse (Android) / NSHTTPURLResponse (iOS)
function completeHandler(e) {
alert("received " + e.responseCode + " code");
var serverResponse = e.response;
}
// event arguments:
// task: Task
function cancelledHandler(e) {
alert("upload cancelled");
}
测试插件
为了测试插件,您必须有一个服务器实例来接受上传。有一些在线服务可以用于小文件上传,例如http://httpbin.org/post
。但是,这些不能用于大文件。插件存储库包含一个您可以在本地运行的简单服务器。以下是启动它的方法
cd demo-server
npm i
node server 8080
上面的命令将在端口8080上启动一个服务器。请记住更新您应用程序中的URL以匹配服务器运行的地址/端口。
注意:如果您正在使用iOS模拟器,则应使用
http://localhost:8080
将文件上传到演示服务器。如果您正在使用Android模拟器,则应使用http://10.0.2.2:8080
。
贡献
我们喜欢PRs!请查看贡献指南。如果您想贡献,但不确定从哪里开始,请查找标记为help wanted
的问题。
获取帮助
请,仅使用github issues来报告错误或请求新功能。对于一般问题和支持,请查看Stack Overflow或在NativeScript社区Slack频道中询问我们的专家。
许可证
Apache许可证版本2.0,2004年1月