鸿蒙里如何上传文件,有具体demo吗?

如题:鸿蒙里如何上传文件,有具体demo吗

阅读 1k
avatarAI BotBETA

在鸿蒙(HarmonyOS)中上传文件,可以通过多种方式实现,具体取决于你的应用场景和所需的功能。以下是一个基于鸿蒙开发环境(如DevEco Studio)的上传文件的基本示例和步骤,以及相关的代码demo。

1. 权限声明

首先,你需要在你的应用中声明必要的权限,比如网络访问权限,以便应用能够向服务器发送数据。在module.json5或相应的配置文件中添加如下权限声明:

"requestPermissions": [
    {
        "name": "ohos.permission.INTERNET"
    }
]

2. 文件选择

你可以使用鸿蒙的文件选择器(FileSelector)来让用户选择需要上传的文件。以下是一个简单的文件选择器使用示例:

// 假设这是在一个方法中
function selectFile() {
    let fs = new FileSelector(this);
    fs.setFileSelectionMode(FileSelector.MODE_SINGLE); // 单选模式
    fs.show();
    // 这里通常会有回调来处理选中的文件,但具体实现取决于你的API版本和框架
}

注意:上述代码仅为示例,实际使用时需要根据鸿蒙的API文档进行调整。

3. 文件上传

一旦文件被选中,你可以使用ohos.request模块来发送HTTP请求,将文件上传到服务器。鸿蒙提供了多种方式来处理网络请求,包括使用HttpURLConnection(尽管这不是鸿蒙特有的,但在一些情况下仍然可用)或更高级的封装,如ohos.request中的uploadFile方法或request.agent

以下是一个使用ohos.request模块的uploadFile方法的示例:

import request from '@ohos.request';

function uploadFile(filePath, url) {
    let header = new Map<Object, string>();
    header.set('Content-Type', 'multipart/form-data'); // 根据需要设置

    let files = [
        {
            filename: 'filename.txt', // 可以从filePath中解析或自定义
            name: 'file', // 服务器端接收的文件参数名
            uri: 'file://' + filePath, // 文件的URI,注意格式可能需要根据实际情况调整
            type: 'text/plain' // 文件的MIME类型
        }
    ];

    let uploadConfig = {
        url: url,
        header: header,
        method: 'POST',
        files: files
    };

    request.uploadFile(getContext(this), uploadConfig)
        .then((uploadTask) => {
            uploadTask.on('complete', (taskStates) => {
                console.log('Upload complete:', taskStates);
            });
        })
        .catch((err) => {
            console.error('Upload failed:', err);
        });
}

注意:上述代码中的getContext(this)和URI格式(file://)可能需要根据你的实际应用场景进行调整。此外,ohos.request模块的具体API和可用性也可能随着鸿蒙版本的更新而发生变化,请参考最新的鸿蒙开发文档。

结论

鸿蒙中上传文件通常涉及权限声明、文件选择和文件上传三个主要步骤。你可以根据自己的需求选择合适的API和框架来实现这些功能。上述示例提供了一个基本的上传文件流程,但请务必根据你的具体情况进行调整和优化。

1 个回答

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...

这边提供一个上传文件的demo,注意当前上传文件必须上传沙箱中cache文件夹中的文件

demo:

import request from '@ohos.request';

import picker from '@ohos.file.picker';

import fs, { ReadOptions } from '@ohos.file.fs';

import common from '@ohos.app.ability.common';

// 获取应用文件路径

let context = getContext(this) as common.UIAbilityContext;

let cacheDir = context.cacheDir;

@Entry

@Component

struct Index4 {

private openPhotoPicker() {

let photoPicker = new picker.PhotoViewPicker();

photoPicker.select({

MIMEType: picker.PhotoViewMIMETypes.IMAGE_TYPE,

maxSelectNumber: 1

}, (error, result) => {

if (result) {

result.photoUris.forEach((uri) => {

let file = fs.openSync(uri, fs.OpenMode.CREATE);

// 复制文件到缓存目录下

fs.copyFileSync(file.fd, cacheDir + '/test.jpeg')

this.uploadImage(['internal://cache/test.jpeg']);

})

}

});

}

private uploadImage(paths: string[]) {

let allFiles = Array<request.File>()

let header = new Map<Object, string>();

header.set('Content-Type', 'multipart/form-data');

header.set('key2', 'value2');

for (let i = 0; i <paths.length; i++) {

allFiles[i] = {

name: "image" + i + ".jpeg",

filename: "image" + i + ".jpeg",

uri: paths[i],

type: "image"

}

}

let data: Array<request.RequestData> = [{ name: 'name', value: 'value' }];

let uploadConfig: request.UploadConfig = {

url: 'http://XXX&#34',

header: header,

method: 'POST',

files: allFiles,

data: data

}

try {

request.uploadFile(getContext(this), uploadConfig, (error, uploadTask) => {

if(uploadTask) {

uploadTask.on('progress', (uploadedSize: number, totalSize: number) => {

console.log("progress, uploadedSize: " + uploadedSize + ", totalSize: " + totalSize)

})

} else {

console.log("upload failure: " + error)

}

});

} catch (error) {

console.log("upload failure: " + error)

}

}

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进