鸿蒙文件上传-从前端到后端详解,对比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.mzph.cn/bicheng/79351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写教育网站后端页面笔记

callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…

日常开发小Tips:后端返回带颜色的字段给前端

一般来说&#xff0c;展示给用户的字体格式&#xff0c;都是由前端控制&#xff0c;展现给用户&#xff1b; 但是当要表示某些字段的数据为异常数据&#xff0c;或者将一些关键信息以不同颜色的形式呈现给用户时&#xff0c;而前端又不好判断&#xff0c;那么就可以由后端来控…

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR&#xff08;通过 spring-boot-maven-plugin 打包&#xff09;虽然简化了部署&#xff0c;但也存在一些潜在缺点&#xff0c;需根据场景权衡&#xff1a; 1. 启动速度较慢 原因&#xff1a; Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…

Flowable7.x学习笔记(十五)动态指定用户分配参数启动工作流程

前言 得益于之前我们的基础工程准备&#xff0c;我们终于可以正式启动工作流程了&#xff0c;在启动之前我们需要分配一下每个用户任务的用户信息&#xff0c;其中有三个选择&#xff1a;【办理人】/【候选组】/【候选用户】&#xff0c;我们需要将系统中的用户ID填入作为固定参…

力扣hot100——98.验证二叉搜索树

题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 首先列举一个错误代码 class Solution { public:bool isValidBST(TreeNode* root) {if(rootnullptr) return true;if(root->right){if(root->right->val<root->val) return f…

数据结构学习之顺序表

在C语言学习到一定阶段之后&#xff0c;接下来我们就进入到了数据结构的部分内容。 目录 数据结构与线性表 顺序表 顺序表分类&#xff1a; 接下来我们要写一段代码实现动态顺序表。 首先我们需要准备三个文件&#xff1a; 1.接下来我们要定义一个数据表 2.当创建号我们的…

C# wpf

学习网址&#xff1a;控件的父类们 - WPF中文网 - 从小白到大佬 控件的父类&#xff1a; 由此我们可以得出结论&#xff0c;控件的父类们(准确的说&#xff0c;应该叫父类的父类的父类)&#xff0c;至少有如下几个类型&#xff1a; DispatcherObjectDependencyObjectVisualU…

JavaEE-多线程实战02

接上 多线程编程实战01 第三个多线程程序 package thread.test;//定义了一个叫MyThread3的类&#xff0c;实现了Runable接口,所以它必须重写run()方法 class MyThread3 implements Runnable {Overridepublic void run() {//线程执行的具体内容//进入一个无限循环&#xff0c;…

【无报错,亲测有效】如何在Windows和Linux系统中查看MySQL版本

如何在Windows和Linux系统中查看MySQL版本 MySQL作为最流行的开源关系型数据库管理系统之一&#xff0c;了解如何查看其版本信息对于开发者和数据库管理员来说是常用的一个基本操作。本文将详细介绍在Windows和Linux系统中查看MySQL版本的方法。 文章目录 如何在Windows和Linu…

数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;智慧能源与运维云平台解决方案 在当今数字化时代&#xff0c;能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生&#xff0c;为企业提供了全面且先进的能源管理和运维手段…

Qt指南针

Qt写的指南针demo. 运行结果 滑动调整指针角度 实现代码 h文件 #ifndef COMPASS_H #define COMPASS_H#include <QWidget> #include <QColor>class Compass : public QWidget {Q_OBJECT// 可自定义属性Q_PROPERTY(QColor backgroundColor READ backgroundColor WRI…

北大新媒体运营黄金提示词 | 北大Deepseek系列第七弹《DeepSeek与新媒体运营》,13所大学系列一站下载

今天大师兄给大家推荐的是北京大学Deepseek系列第七弹《DeepSeek与新媒体运营》。 本文档系统介绍了DeepSeek模型在新媒体运营中的应用&#xff0c;技术原理、实践案例及行业挑战。 适用人群&#xff1a;新媒体运营人员、AI研究者、企业决策者。 思维导图 napkin生成 《老…

2025年真实面试问题汇总(一)

Spingboot中如何实现有些类是否加载 在 Spring Boot 中可以通过 条件化配置&#xff08;Conditional Configuration&#xff09; 来控制某些类是否加载。Spring Boot 提供了一系列 Conditional 注解&#xff0c;允许根据特定条件动态决定 Bean 或配置类是否生效。以下是常见的…

综合案例建模(2)

文章目录 螺旋片端盖多孔扭转环作业一作业二作业三 螺旋片端盖 上视基准面画草图&#xff0c;拉伸250&#xff0c;向外拔模15度 以地面圆&#xff08;如果不行就转换实体引用&#xff09;&#xff0c;创建螺旋线&#xff0c;锥形螺纹线15度向外 前视基准面去画草图 以上一步草图…

Qt5与现代OpenGL学习(三)纹理

把第一张图放到D盘的1文件夹里面&#xff1a;1.png triangle.h #ifndef WIDGET_H #define WIDGET_H#include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLVertexArrayObject> #include <QOpenGLShaderProgram> #include <QOpen…

这是一款好用的PDF工具!

用户习惯有时确实非常顽固&#xff0c;想要改变它可能需要漫长的时间。 比如PDF软件&#xff0c;我认为国产的福/昕、万/兴等软件都非常不错&#xff0c;它们贴合国人的使用习惯&#xff0c;操作起来非常顺手。但因为我习惯使用DC&#xff0c;所以在处理PDF文档时&#xff0c;…

轻松实现CI/CD: 用Go编写的命令行工具简化Jenkins构建

在工作中&#xff0c;随着开发维护的服务越来越多&#xff0c;在很长的一段时间里&#xff0c;我来回在多个服务之间开发、构建、查看容器是否启动成功。尤其是开发测试阶段&#xff0c;需要打开jenkins页面、搜索应用、再构建、再打开rancher页面、搜索应用&#xff0c;这一连…

第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;移动距离 试题C&#xff1a;可分解的正整数 试题D&#xff1a;产值调整 试题E&#xff1a;画展布置 前言&#xff1a; 我参加的是第一轮省赛&#xff0c;说实话第一次参加还是比较紧张的&#xff0c;真到考场上看啥都想打暴力&…

Qt Creator环境编译的Release软件放在其他电脑上使用方法

本文解决的问题&#xff1a;将Qt Creator环境编译的exe可执行程序放到其他电脑上不可用情况 1、寻找windeployqt工具所在路径" D:\Qt5.12.10\5.12.10\msvc2015_64\bin" &#xff0c;将此路径配置到环境变量&#xff1b; 2、用Qt Creator环境编译出Release版本可执行…

使用skywalking进行go的接口监控和报警

安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …