@nativescript/background-http
为 iOS 和 Android 提供后台上传功能
npm i --save @nativescript/background-http

@nativescript/background-http

一个允许您进行后台 HTTP 上传的插件。

内容

安装

npm install @nativescript/background-http

使用 @nativescript/background-http

要执行后台 HTTP 调用,请按照以下步骤操作

  1. 初始化后台 HTTP 服务

调用 init() 函数以初始化在后台运行的 HTTP 服务。在 main.ts 文件中,在应用启动之前尽早调用该方法。

import { init } from '@nativescript/background-http';
init();
  1. 上传文件

    1. 通过调用 session() 函数并传入会话的唯一标识符字符串(例如,image-upload)来创建上传会话。
    // 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,
    };
    1. 上传文件
    • 要发起一个简单的上传请求,调用 sessionuploadFile() 方法并传入文件路径和一个 上传请求对象
    var task = session.uploadFile(filePath, request);
    • 要发起一个 multipart/form-data 上传请求或传递额外数据,调用 multipartUpload() 方法。所有参数值都必须是字符串
    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。

处理上传任务事件

Both uploadFile()multipartUpload() 都会启动并返回一个 任务 实例。

上传任务启动后,您可以使用以下事件来监控其进度。

有关事件对象的更多信息,请参阅 任务事件

task.on("progress", progressHandler);
task.on("error", errorHandler);
task.on("responded", respondedHandler);
task.on("complete", completeHandler);
task.on("cancelled", cancelledHandler); // Android only

每个事件处理程序接收一个包含事件数据的单个参数。

function progressHandler(e: ProgressEventData) {

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: ErrorEventData) {
alert("received " + e.responseCode + " code.");
var serverResponse = e.response;
}


// event arguments:
// task: Task
// responseCode: number
// data: string
function respondedHandler(e: ResultEventData) {
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: CompleteEventData) {
alert("received " + e.responseCode + " code");
var serverResponse = e.response;
}

// event arguments:
// task: Task
function cancelledHandler(e: EventData) {
alert("upload cancelled");
}

API

init()

import { init } from '@nativescript/background-http';

init()

初始化 HTTP 后台服务。


session()

import { session } from '@nativescript/background-http';
session: Session = session(id: string)

通过 ID 获取或创建后台下载/上传会话。


会话对象

会话对象具有以下成员

  • uploadFile(fileUri: string, options: Request): Task
  • multipartUpload(params: Array<any>, options: Request): Task

这两个方法都会启动一个新的后台文件(s)上传任务。 uploadFile() 用于单个文件上传,而 multipartUpload() 用于多个文件上传。 fileUri 是要上传文件的路径。 options 参数表示 请求对象

上传请求对象

请求对象参数具有以下属性

名称 类型 描述
url string 请求 URL(例如 https://some.remote.service.com/path)。
method string The request method (e.g. POST).
headers object 用于指定额外的头信息。
description string 用于帮助在本地识别上传任务 - 不会发送到远程服务器。
utf8 boolean (仅限Android/仅限multipart) 如果为true,则将multipart请求的字符集设置为UTF-8。默认为false。
androidNotificationOnProgressTitle string 用于设置在Android通知中心显示的进度标题。
androidNotificationOnProgressMessage string 用于设置在Android通知中心显示的进度消息。
androidNotificationOnCompleteTitle string 用于设置在Android通知中心显示的完成消息。
androidNotificationOnCompleteMessage string 用于设置在Android通知中心显示的错误标题。
androidNotificationOnErrorTitle string 用于设置在Android通知中心显示的错误标题。
androidNotificationOnErrorMessage string 用于设置在Android通知中心显示的错误消息。
androidNotificationOnCancelledTitle string 用于设置在Android通知中心显示的取消标题。
androidNotificationOnCancelledMessage string 用于设置在Android通知中心显示的取消消息。
androidAutoDeleteAfterUpload boolean (仅限Android) 用于设置是否在上传后自动删除文件。
androidMaxRetries 数字 (仅限Android) 用于设置最大重试次数。默认重试次数为0。请参阅https://github.com/gotev/android-upload-service/wiki/Recipes#backoff
androidAutoClearNotification boolean (仅限Android) 用于设置是否在上传完成后自动清除通知。默认为false。请注意,将此设置为true将禁用铃声。
androidRingToneEnabled boolean (仅限Android) 用于设置是否在上传完成后播放铃声。默认为true。请注意,当androidAutoClearNotification设置为true时,此标志将不起作用。
androidNotificationChannelID string (仅限Android) 用于设置通知的通道ID。

注意:Android通知的标题/消息可以使用以下占位符之一构建,系统将替换它们

  • [upload_rate]:替换为当前的上传速率/速度
  • [upload_progress]:替换为当前的上传进度
  • [upload_elapsed_time]:替换为已过时间

任务对象

任务对象具有以下属性和方法,可以用来获取上传信息

名称 类型 描述
upload 数字 已上传的字节数。
totalUpload 数字 要上传的总字节数。
status string 以下之一:erroruploadingcompletependingcancelled
description string 在创建上传任务时用于设置描述的请求。
cancel() void 调用此方法以取消正在进行的上传。
on() void 用于添加任务事件处理程序的方法。

EventData

名称 类型 描述
eventName string 事件名称。例如,progress
object Task 触发事件的任务。

所有任务事件都扩展了EventData接口。

ProgressEventData

名称 类型 描述
currentBytes 数字 已传输的字节数。
totalBytes 数字 预期的传输字节数。

ResultEventData

名称 类型 描述
data string 来自服务器的字符串响应。
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1

CompleteEventData

名称 类型 描述
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1
response net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS) 来自服务器的响应。

ErrorEventData

名称 类型 描述
error NSError | java.lang.Exception 提供底层错误。iOS为NSError,Android为java.lang.Exception
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1
response net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS) 来自服务器的响应。

API

init()

import { init } from '@nativescript/background-http';

init()

初始化 HTTP 后台服务。


session()

import { session } from '@nativescript/background-http';

session: Session = session(id)

通过 ID 获取或创建后台下载/上传会话。


uploadFile()

session.uploadFile(filePath,requestOptions)

session对象的一个方法,用于启动后台任务,将指定的文件编码为application/x-www-form-urlencoded

参数 类型 描述
filePath string 要上传的文件的路径。
request 请求 为后台请求提供元数据。

multipartUpload()

session.multipartUpload()

session对象的一个方法,用于启动后台任务,将指定的文件编码为multipart/form-data

上传请求对象

请求对象参数具有以下属性

名称 类型 描述
url string 请求 URL(例如 https://some.remote.service.com/path)。
method string The request method (e.g. POST).
headers object 用于指定额外的头信息。
description string 用于帮助在本地识别上传任务 - 不会发送到远程服务器。
utf8 boolean (仅适用于Android, multipartUpload()-仅适用) 如果为真,则将multipart请求的字符集设置为UTF-8。默认为false
androidNotificationOnProgressTitle string 用于设置在Android通知中心显示的进度标题。
androidNotificationOnProgressMessage string 用于设置在Android通知中心显示的进度消息。
androidNotificationOnCompleteTitle string 用于设置在Android通知中心显示的完成消息。
androidNotificationOnCompleteMessage string 用于设置在Android通知中心显示的完成消息。
androidNotificationOnErrorTitle string 用于设置在Android通知中心显示的错误标题。
androidNotificationOnErrorMessage string 用于设置在Android通知中心显示的错误消息。
androidNotificationOnCancelledTitle string 用于设置在Android通知中心显示的取消标题。
androidNotificationOnCancelledMessage string 用于设置在Android通知中心显示的取消消息。
androidAutoDeleteAfterUpload boolean (仅适用于Android) 用于设置文件在上传后是否自动删除。
androidMaxRetries 数字 (仅适用于Android) 用于设置最大重试次数。默认重试次数为0。请参阅 https://github.com/gotev/android-upload-service/wiki/Recipes#backoff
androidAutoClearNotification boolean (仅适用于Android) 用于设置在上传完成后是否自动清除通知。默认为false。请注意,将此设置为true也将禁用铃声。
androidRingToneEnabled boolean (仅适用于Android) 用于设置在上传完成后是否播放铃声。默认为true。请注意,当androidAutoClearNotification设置为true时,此标志没有作用。
androidNotificationChannelID string (仅适用于Android) 用于设置通知的通道ID。

注意:Android通知的标题/消息可以使用以下占位符之一构建,系统将替换它们

  • [upload_rate]:替换为当前的上传速率/速度
  • [upload_progress]:替换为当前的上传进度
  • [upload_elapsed_time]:替换为已过时间

任务对象

任务对象具有以下属性和方法。

名称 类型 描述
upload 数字 已上传的字节数。
totalUpload 数字 要上传的总字节数。
status string 以下之一:erroruploadingcompletependingcancelled
description string 在创建上传任务时用于设置描述的请求。
cancel() void 调用此方法以取消正在进行的上传。
on() void 用于添加任务事件处理器的方 法。

任务事件

以下是在后台任务的不同进度状态时发出的事件

  • EventData
名称 类型 描述
eventName string 事件名称。例如,progress
object Task 触发事件的任务。

所有以下任务事件都扩展了前面的EventData接口。

  • ProgressEventData
名称 类型 描述
currentBytes 数字 已传输的字节数。
totalBytes 数字 预期的传输字节数。
  • ResultEventData
名称 类型 描述
data string 来自服务器的字符串响应。
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1
  • CompleteEventData
名称 类型 描述
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1
response net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS) 来自服务器的响应。
  • ErrorEventData
名称 类型 描述
error NSError | java.lang.Exception 提供底层错误。iOS为NSError,Android为java.lang.Exception
responseCode 数字 如果存在响应对象,则为HTTP响应代码。否则为-1
response net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS) 来自服务器的响应。

本地测试插件

要测试插件,您必须有一个服务器实例来接受上传。有一些在线服务可以用于小文件上传 - 例如 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代替。

许可证

Apache License Version 2.0