当前位置: 首页 > java >正文

鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile

需要权限:ohos.permission.INTERNET

1.nodejs自定义书写上传后端接口

传输过来的数据放在files?.image下
在这里插入图片描述

router.post('/upload',(req, res) => {var form = new multiparty.Form();form.uploadDir='public/images/uploads'; //上传图片保存的地址(目录必须存在)form.parse(req, function(err, fields, files) {// 1、fields:获取表单的数据 2、files:图片上传成功返回的信息console.log(files,fields)const fileurl = Date.now()+ files?.image[0]?.originalFilename;let newPath = form.uploadDir + '/' +fileurlfs.renameSync(files.image[0].path,newPath);let imgUrl = myUrl.myUrl+'/images/uploads/' +fileurlres.send({code: '200',message: '数据上传成功',data:imgUrl})})
})

2,在jq中请求(new FormData())

        var fileImg;//读取图片function fileUpload(_this) {var fileReader = new FileReader();//创建文件读取对象fileImg = _this.files[0];//获取file组件中的文件}//上传图片function uploadPictures() {var formData = new FormData();//图片if (fileImg != null) {formData.append("image", fileImg);}$.ajax({url: 'http://localhost:3333/api/img/upload',type: 'post',data: formData,processData: false,contentType: false,success: function (res) {// var res = JSON.parse(res);console.log('upload success', res);// $('.img').attr('src', res.path);debugger},error: function (err) {console.log('upload error', err);console.log(err);}});}

3.对比在鸿蒙arkts请求如下 -试用相册的场景

参考官网

1.假设数据来源于相册,以下是获取相册的数据,photoSelectResult.photoUris[0]是一个目录的路径, 但是不是context.cacheDir的路径,

试用下载必须要在cacheDir目录下面

async selectPhoto() {try {let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.maxSelectNumber = 1;PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;let textInfo: photoAccessHelper.TextContextInfo = {text: '人像'};let recommendationOptions: photoAccessHelper.RecommendationOptions = {textContextInfo: textInfo};PhotoSelectOptions.recommendationOptions =recommendationOptions; // 将推荐参数赋值给 photoSelectOptions.recommendationOptionslet photoPicker = new photoAccessHelper.PhotoViewPicker();let photoSelectResult = await photoPicker.select(PhotoSelectOptions)if (photoSelectResult.photoUris.length == 1) {this.uploadFile(photoSelectResult.photoUris[0])}} catch (error) {let err: BusinessError = error as BusinessError;}}

2.因为必须是cacheDir目录,从相册拿到的的图片就复制一份存在cacheDir

// 提取文件扩展名的函数getFileExtension(fileName: string): string {const lastDotIndex = fileName.lastIndexOf('.');if (lastDotIndex !== -1 && lastDotIndex < fileName.length - 1) {return fileName.slice(lastDotIndex + 1);}return '';}
。。。。。console.log('photoUris', photoUris)const extensionName = this.getFileExtension(photoUris) // 后缀名console.log('文件扩展名是:', extensionName);const cacheDir = context.cacheDir; // 缓存根目录const names = 'phone' + Date.now() + '.' + extensionName // 文件名const cacheF = cacheDir + '/' + names // 缓存目录路径let file: fileIo.File | undefined;file = fileIo.openSync(photoUris, fileIo.OpenMode.READ_ONLY); // 打开现有的文件fileIo.copyFileSync(file.fd, cacheF); //复制一下到缓存文件fileIo.closeSync(file); // 关闭console.log('文件扩展名是:', extensionName, '----', names);

3。知道了cacheDir目录就组装参数

let files: Array<request.File> = [//uri前缀internal://cache 对应cacheDir目录{filename: names,name: 'image',  // 必须是image,因为接口拿的数据就是这个的第0项uri: 'internal://cache/' + names,type: extensionName}]let data: Array = [{ name: 'name', value: 'value' }];let uploadConfig: request.UploadConfig = {url: 'http://xxxxxxxxxxxxxxxx/api/img/upload',header: {// 根据项目添加
},method: 'POST',files: files,data: data,}// 将本地应用文件上传至网络服务器
try {request.uploadFile(context, uploadConfig).then((uploadTask: request.UploadTask) => {let headerCallback = (value: object) => {let str = JSON.stringify(value)console.log("http:success:", JSON.stringify(rstr ))};uploadTask.on('headerReceive', headerCallback);}).catch((err: BusinessError) => {console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);})
} catch (error) {let err: BusinessError = error as BusinessError;console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
}

缓存目录在cacheDir ="/data/app/el2/100/base/{找到自己的包名}/haps/entry/cache”
在这里插入图片描述

在这里插入图片描述

原理总结

使用相册拿到的路径,复制一份放在缓存路径下, request.uploadFile(只能读缓存的路径。
通过 uploadTask.on(‘headerReceive’, headerCallback);拿到后端给我们的响应数据code

官网也还提供了request.agent,可查看文档使用
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-file-upload-download#%E4%B8%8A%E4%BC%A0%E5%BA%94%E7%94%A8%E6%96%87%E4%BB%B6

http://www.xdnf.cn/news/3091.html

相关文章:

  • 合并多个Excel文件到一个文件,并保留格式
  • PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog
  • SpringBoot+EasyExcel+Mybatis+H2实现导入
  • 力扣面试150题--删除排序链表中的重复元素 II
  • 4.29[Q]NLP-Exp2
  • uni-app - 小程序使用高德地图完整版
  • Snap7西门子PLC通信协议
  • 【Python魔法方法(特殊方法)】
  • VSCode Verilog编辑仿真环境搭建
  • 松灵PiPER强势突围,攻克具身智能“数据壁垒”
  • [逆向工程]深入理解计算机中的“栈”
  • 内容/社区APP增长:用Deeplink让用户分享的内容“一键直达”
  • 4.2.4 MYSQL的缓存策略
  • C++中vector的扩容过程是怎样的?
  • ARP渗透学习1
  • 农村供水智能化远程监控解决方案
  • std::optional 类是个啥?
  • esp32将partitions.csv文件启用到工程项目中的配置
  • antd pro4 升级 antd5
  • 深入解析:实现一个详细的日志过滤器(LogFilter)
  • 2025年渗透测试面试题总结-拷打题库25(题目+回答)
  • 30天通过软考高项-第一天
  • 刀客doc:小红书商业技术负责人苍响离职
  • 信息系统项目管理师——第10章 项目进度管理 笔记
  • 解决Ollama run qwen3:32b: Error: unable to load model问题
  • 阵列麦克风降噪原理
  • 记录一个单独读取evt.bdf的方法
  • 头歌java课程实验(文件操作)
  • 【CF】Day46——Codeforces Round 967 (Div. 2) B
  • 2025年高级Java后端面试题:最新技术体系深度解析