鴻蒙文件上傳-從前端到后端詳解,對比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.pswp.cn/bicheng/79351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79351.shtml
英文地址,請注明出處:http://en.pswp.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 …