0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙上實現(xiàn)文件上傳功能

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 作者:OST開源開發(fā)者 ? 2023-05-22 10:51 ? 次閱讀

此帖主要講解通過開發(fā)文檔示例代碼寫一個完整 Demo,方便初學(xué)者理解開發(fā)文檔內(nèi)容。

大家都知道 3.0 使用的是 FA 模式、3.1 使用的是 Stage 模式,所以同樣是文件上傳,代碼寫法上有些不一樣,開發(fā)文檔也不一樣。

比如在 3.1 下,可以在 HarmonyOS Developer > 文檔 > 指南 > 開發(fā)下找到文件上傳下載示例代碼。

而在 3.0 下,就找不到相應(yīng)指南開發(fā)了,只能在 HarmonyOS Developer > 文檔 > API 參考 > ArkTS API 參考找到 @ohos.request (上傳下載)文檔。

為了實現(xiàn)一個完整文件上傳 Demo,后端是少不了的,這里我使用了我平常工作中用到的 SpringBoot 開發(fā)后端。

為了驗證文件上傳接口是否正常,使用 Thymeleaf 寫一個簡單的前端頁面來測試接口,先保證后端文件上傳接口是正常的。

這樣其它前端調(diào)用就可以排除后端文件上傳接口問題,專心調(diào)試前端代碼,希望小伙伴通過此貼學(xué)習(xí)到文件上傳同時,參考此思路也可以自己完成其它示例代碼完成 Demo。

效果如下:

b12abf04-f7fb-11ed-90ce-dac502259ad0.gif

ArkTS(3.0)文件管理(前端)

此版本使用的是 FA 模式、配置文件名是 config.json 由于文件上傳需要網(wǎng)絡(luò),需要添加權(quán)限:ohos.permission.INTERNET,默認支持 https。

如果要支持 http,需要在 config.json 里增加 network 標簽,屬性標識 “cleartextTraffic”: true。

所以 config.json 要添加的內(nèi)容以下:

{
"app":{...},
"deviceConfig":{
"default":{
"network":{
"cleartextTraffic":true
}
}
},
"module":{
"reqPermissions":[
{
"name":"ohos.permission.INTERNET"
}
]
}
}
文件上傳頁面就一個 index.ets 文件,里面包含 UI 和調(diào)用后端接口,代碼如下:
importrequestfrom'@ohos.request';
importfeatureAbilityfrom'@ohos.ability.featureAbility';
importfileiofrom'@ohos.fileio';

@Entry
@Component
structIndex{
@StatebtnLabel:string='提交文件'
privateuploadTask:request.UploadTask

aboutToAppear(){
//獲取應(yīng)用文件路徑
varcontext=featureAbility.getContext();
context.getCacheDir().then((data)=>{
console.info("xx======================>getCacheDirPromsie====================>");
console.info("xx====>data====>"+JSON.stringify(data));

//新建一個本地應(yīng)用文件
letfd=fileio.openSync(data+'/test.txt',0o102,0o666);
fileio.writeSync(fd,'uploadfiletestbyarmy');
fileio.closeSync(fd);
});
}

aboutToDisappear(){
this.uploadTask.off("progress")
}

uploadFile(){
//上傳任務(wù)配置項
letuploadConfig={
url:'http://111.114.238.134:8740/file/upload',
header:{key1:'Content-Type',key2:'multipart/form-data'},
method:'POST',
files:[
{filename:'test.txt',name:'test',uri:'internal://cache/test.txt',type:'txt'}
],
data:[
{name:'fileId',value:'FP000008'}
]
}

//將本地應(yīng)用文件上傳至網(wǎng)絡(luò)服務(wù)器
try{
this.btnLabel='文件上傳中...'
request.upload(uploadConfig)
.then((data)=>{
this.btnLabel='文件上傳成功'
this.uploadTask=data
console.info('xxSuccesstorequesttheupload.Cause:'+JSON.stringify(data));
//uploadTask=data;
this.uploadTask.on("progress",(uploadedSize,totalSize)=>{
console.info('xx上傳進度值是:'+uploadedSize+',總大小:'+totalSize)
})

}).catch((err)=>{
this.btnLabel='文件上傳失敗'
console.error('xxFailedtorequesttheupload.Cause:'+JSON.stringify(err));
})
}catch(err){
this.btnLabel='文件上傳失敗'
console.error(`xxInvokeuploadFilefailed,codeis${err.code},messageis${err.message}`);
}

}

build(){
Column({space:30}){
Text('上傳文件實例:')
.width('100%')
.height(50)
.fontSize(24)
.textAlign(TextAlign.Center)
Button('提交文件')
.onClick(()=>{
this.uploadFile()
})
.width('80%')
.height(50)
.fontSize(24)
}.width('100%').height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
}
}

ArkTS(3.1)文件管理(前端)

此版本使用的是 Stage 模式、配置文件名是 module.json5 由于文件上傳需要網(wǎng)絡(luò),需要添加權(quán)限:ohos.permission.INTERNET。

在 3.1 不用配置,就支持 http 和 https,當前上傳應(yīng)用文件功能,僅支持上傳應(yīng)用緩存文件路徑(cacheDir)下的文件。

所以 module.json5 要添加的內(nèi)容以下:

{
"module":{
"requestPermissions":[
{
"name":"ohos.permission.INTERNET"
}
]
}
}
文件上傳頁面就一個 index.ets 文件,里面包含 UI 和調(diào)用后端接口,代碼如下:
importcommonfrom'@ohos.app.ability.common';
importfsfrom'@ohos.file.fs';
importrequestfrom'@ohos.request';
importhashfrom'@ohos.file.hash';


//獲取應(yīng)用文件路徑
letcontext=getContext(this)ascommon.UIAbilityContext;

@Entry
@Component
structIndex{
@StatebtnLabel:string='提交文件'
privateuploadTask:request.UploadTask

aboutToAppear(){
letcacheDir=context.cacheDir;

//新建一個本地應(yīng)用文件
letfile=fs.openSync(cacheDir+'/test.txt',fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);
fs.writeSync(file.fd,'uploadfiletestbyAPI9');
fs.closeSync(file);
}

aboutToDisappear(){
this.uploadTask.off("complete")
}

uploadFile(){

//上傳任務(wù)配置項
letuploadConfig={
url:'http://111.114.238.134:8740/file/upload',
header:{key1:'Content-Type',key2:'multipart/form-data'},
method:'POST',
files:[
{filename:'test.txt',name:'test',uri:'internal://cache/test.txt',type:'txt'}
],
data:[
{name:'fileId',value:'FP000008'}
]
}

//將本地應(yīng)用文件上傳至網(wǎng)絡(luò)服務(wù)器
try{
this.btnLabel='文件上傳中...'
request.uploadFile(context,uploadConfig)
.then((data)=>{
this.btnLabel='文件上傳成功'
this.uploadTask=data
this.uploadTask.on('complete',(taskStates)=>{
for(leti=0;i{
this.btnLabel='文件上傳失敗'
console.error(`xxInvokeuploadFilefailed,codeis${err.code},messageis${err.message}`);
})
}catch(err){
this.btnLabel='文件上傳失敗'
console.error(`xxInvokeuploadFilefailed,codeis${err.code},messageis${err.message}`);
}
}

build(){
Column({space:30}){
Text('上傳文件實例:')
.width('100%')
.height(50)
.fontSize(24)
.textAlign(TextAlign.Center)
Button(this.btnLabel)
.onClick(()=>{
this.uploadFile()
})
.width('80%')
.height(50)
.fontSize(24)
}
.width('100%').height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
}
}

SpringBoot 和 Thymeleaf(后端)

后端首先列出 pom.xml 文件,里面包含項目依賴jar配置,比如 web、thymeleaf 依賴。

內(nèi)容如下:



4.0.0

org.springframework.boot
spring-boot-starter-parent
2.3.1.RELEASE
 

com.army
file-manage
0.0.1-SNAPSHOT
file-manage
DemoprojectforSpringBoot

8



org.springframework.boot
spring-boot-starter-thymeleaf


org.springframework.boot
spring-boot-starter-web



org.projectlombok
lombok
true


org.springframework.boot
spring-boot-starter-test
test


commons-io
commons-io
2.6






org.springframework.boot
spring-boot-maven-plugin



org.projectlombok
lombok





前端調(diào)用接口文件 Controller 代碼如下:
@RestController
@RequestMapping("/file")
@Slf4j
publicclassFileController{
@Autowired
FileServicefileService;

@PostMapping("/upload")
publicStandardResponseupload(StringfileId,MultipartHttpServletRequestmultiPartRequest){
log.info("**UploadFileController!");

FileCriteriacriteria=newFileCriteria();
criteria.setFileId(fileId);

try{
//uploadfile
Iteratoritr=multiPartRequest.getFileNames();
MultipartFilempf=null;

while(itr.hasNext()){
mpf=multiPartRequest.getFile(itr.next());
break;
}
byte[]fileByteArr=null;
if(null!=mpf&&!mpf.isEmpty()){
StringoriginalFileName=mpf.getOriginalFilename();
log.info(originalFileName);
criteria.setFileName("");
StringfileExtension=FilenameUtils.getExtension(originalFileName);
criteria.setFileExtension(fileExtension);
fileByteArr=mpf.getBytes();
criteria.setFileByteArray(fileByteArr);

criteria.setFileName(originalFileName);
}
}catch(IOExceptione){
e.printStackTrace();
log.error(e.getMessage());
}

returnfileService.uploadFile(criteria);
}

}

后端業(yè)務(wù)邏輯代碼,也就是文件上傳處理邏輯 Service 代碼如下:

業(yè)務(wù)接口:

publicinterfaceFileService{
StandardResponseuploadFile(FileCriteriacriteria);

StringsaveFile(FileCriteriacriteria);
}
業(yè)務(wù)實現(xiàn)類:
@Service
@Slf4j
publicclassFileServiceImplimplementsFileService{
@Value("${project.root.path}")
privateStringrootPath="rootPath";
@Value("${project.baseUrl}")
privateStringbaseUrl;

@Override
publicStandardResponseuploadFile(FileCriteriacriteria){
StringfilePath=this.saveFile(criteria);
StringimgPath=baseUrl+"filePath/"+filePath;

StandardResponsestandardResponse=newStandardResponse();
standardResponse.setSuccess(true);
standardResponse.setStatusCode("100");
standardResponse.setStatusDesc("上傳成功");
standardResponse.setData(imgPath);
returnstandardResponse;
}

@Override
publicStringsaveFile(FileCriteriacriteria){
log.info("上傳文件開始!");
StringpictureId=IdUtils.getId("FP");
StringfileName=pictureId+"."+criteria.getFileExtension();
criteria.setFileName(fileName);


StringfilePath=sourceFile(criteria);
log.info("FilePath:"+filePath);
log.info("上傳文件結(jié)束!");
returnfilePath;
}

privateStringsourceFile(FileCriteriacriteria){
byte[]attachmentFileByteArray=criteria.getFileByteArray();
if(null!=attachmentFileByteArray){

log.info("1.1.創(chuàng)建根目錄.");
StringbasePath=rootPath+this.genDatePath();
FilebasePathFolder=newFile(basePath);
if(!basePathFolder.exists())basePathFolder.mkdirs();
log.info("根目錄:"+basePath);

Filefile=newFile(basePath+File.separator+criteria.getFileName());
log.info("1.2.保存源文件-絕對路徑:"+file.getAbsolutePath());

try{
FileCopyUtils.copy(attachmentFileByteArray,file);
log.info("1.3.1.保存源文件-保存成功!!!");

StringrelativePath=this.genDatePath()+File.separator+criteria.getFileName();

returnrelativePath;
}catch(IOExceptione){
log.info("1.3.2.保存源文件-保存失敗!!!");
file.deleteOnExit();
return"";
}
}
return"";
}

privateStringgenDatePath(){
SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMdd");
StringyyyyMMdd=sdf.format(newDate());

returnyyyyMMdd;
}
}
配置文件:
server:
port:8740

project:
root:
path:/var/tomcat/file-manage/filePath/
baseUrl:http://111.114.238.134:8740/
訪問域名或 IP 加端口訪問到 Thymeleaf 頁面,要添加一個 Controller 跳轉(zhuǎn)。
@Controller
publicclassIndexController{

@GetMapping("/")
publicStringIndex(){
return"index";
}
}

在 templates 目錄下創(chuàng)建 index.htm 頁面文件,這里的 index 名要和上面 Controller 返回“index”名一致,才能跳轉(zhuǎn)過去。

index.html 代碼如下:


單文件上傳

b143884a-f7fb-11ed-90ce-dac502259ad0.png

b1562b6c-f7fb-11ed-90ce-dac502259ad0.png

上面圖片就是 Thymeleaf 頁面,上傳文件成功后效果。

總結(jié)

通過此貼學(xué)習(xí)到文件上傳 3.0 與 3.1 的不同處,同時也學(xué)習(xí)到了后端開發(fā)流程。 其實寫這個貼子之前,是一個小伙伴問到我關(guān)于文件上傳問題,由于之前我寫的實例里,也沒有用到文件上傳功能,于是我就用最新 API9 也就是 Stage 模式寫了一個 Demo 給他參考,然后他通過參考我的 Demo,學(xué)會了。 可惜他現(xiàn)在開發(fā)的項目是用 API8 的,由于開發(fā)模式不一樣,他遇到了問題,于是我在用 API8 寫了一個 Demo 給他參考,最后他的項目也實現(xiàn)了文件上傳。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8598

    瀏覽量

    151163
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1501

    瀏覽量

    62025
  • 開發(fā)者
    +關(guān)注

    關(guān)注

    1

    文章

    575

    瀏覽量

    17013
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2352

    瀏覽量

    42859
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1975

    瀏覽量

    30201

原文標題:鴻蒙上實現(xiàn)“文件上傳”功能

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙原生應(yīng)用元服務(wù)開發(fā)-Web上傳文件

    Web組件支持前端頁面選擇文件上傳功能,應(yīng)用開發(fā)者可以使用onShowFileSelector()接口來處理前端頁面文件上傳的請求。 下面的示例中,當用戶在前端頁面點擊
    發(fā)表于 05-08 11:17

    如何在openmv中實現(xiàn)傳功能

    Vision board的openmv固件wifi只能實現(xiàn)連接,一些通信和物聯(lián)網(wǎng)也用不了。如果我要實現(xiàn)在openmv中的圖傳功能該怎么做呢,求助各位大佬
    發(fā)表于 07-09 06:36

    這個CMS系統(tǒng)可以同時選擇多個文件上傳,是怎么實現(xiàn)的?

    我發(fā)現(xiàn)有個CMS系統(tǒng), 叫網(wǎng)站快車,他有一個指上傳功能,能框選多個文件,同時上傳,上傳中有進度顯示,這個是怎么作到的?大家看,他這里可以這樣選擇圖片。然后把
    發(fā)表于 02-09 17:13

    如何使用DGUS II的數(shù)據(jù)自動上傳功能

    使用DGUS II時,如果想要實現(xiàn)數(shù)據(jù)自動上傳,需要注意以下幾點:1. 在軟件中勾選“數(shù)據(jù)自動上傳功能”,或者用“按鍵值返回”控件代替“基本觸控”控件;勾選的地方在如下圖:2. 在CFG文件
    發(fā)表于 01-02 20:52

    利用java語言實現(xiàn)文件上傳功能

    本文首先介紹了java 中的文件處理類,然后在參考了RFC 文件的基礎(chǔ)上,對上傳文件的信息格式進行了詳細的介紹。最后結(jié)合實際,利用Jakarta Commons 項目的一個組件comm
    發(fā)表于 09-15 15:48 ?37次下載

    基于Iframe內(nèi)聯(lián)框架的異步文件上傳與刪除

    在Weh應(yīng)用程序開發(fā)過程中,文件上傳功能是個很常用又非常重要的功能,它要處理的內(nèi)容主要包括:如何將上傳文件
    發(fā)表于 11-11 10:20 ?5次下載
    基于Iframe內(nèi)聯(lián)框架的異步<b class='flag-5'>文件</b><b class='flag-5'>上傳</b>與刪除

    如何在java上傳和下載文件

    文件上傳在web應(yīng)用中非常普遍,要在jsp環(huán)境中實現(xiàn)文件上傳功能是非常容易的,因為網(wǎng)上有許多用java開發(fā)的
    發(fā)表于 11-13 08:00 ?11次下載

    java Web如何實現(xiàn)文件上傳與下載

    文件上傳概述,實現(xiàn)web開發(fā)中的文件上傳功能,需完成如下二步操作: 在web頁面中添加上傳輸入
    發(fā)表于 03-06 11:03 ?7次下載
    java Web如何<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>文件</b>的<b class='flag-5'>上傳</b>與下載

    Verizon宣布在所有5G市場開啟5G上傳功能

    據(jù)國外媒體報道,Verizon已宣布在所有5G市場開啟5G上傳功能,為人們上傳高清視頻以及玩大型在線多人游戲提供更快的速度。
    發(fā)表于 05-21 11:54 ?610次閱讀

    鴻蒙上使用Python進行物聯(lián)網(wǎng)編程

    在上一篇帖子《使用 Python 開發(fā)鴻蒙設(shè)備程序(1-GPIO 外設(shè)控制)》中,已經(jīng)成功的使用 Python 對 GPIO 上的外設(shè)進行了控制。 這其實不是什么大不了的事,從功能的角度也著實不值得
    的頭像 發(fā)表于 09-28 09:55 ?4299次閱讀
    在<b class='flag-5'>鴻蒙上</b>使用Python進行物聯(lián)網(wǎng)編程

    鴻蒙上安裝按鈕實現(xiàn)下載、暫停、取消、顯示等操作

    今天給大家分享在鴻蒙上一個按鈕實現(xiàn)下載、暫停、取消、顯示下載進度操作。
    的頭像 發(fā)表于 01-04 14:32 ?2306次閱讀

    如何使用DGUS II的數(shù)據(jù)自動上傳功能

    使用DGUS II時,如果想要實現(xiàn)數(shù)據(jù)自動上傳,需要注意以下幾點:? (1) 在軟件中勾選“數(shù)據(jù)自動上傳功能”,或者用“按鍵值返回”控件代替“基本觸控”控件;? 勾選的地方在如下圖紅色框選位置
    發(fā)表于 01-18 15:05 ?879次閱讀
    如何使用DGUS II的數(shù)據(jù)自動<b class='flag-5'>上傳功能</b>

    HarmonyOS應(yīng)用開發(fā)okhttp3.0快速集合文件上傳

    ? ? ? ? ?應(yīng)用開發(fā)過程中經(jīng)常需要進行文件上傳功能開發(fā),通過okhttp3.0可以快速集合完成文件上傳功能。 代碼如下: OkHtt
    的頭像 發(fā)表于 03-08 10:24 ?1748次閱讀

    鴻蒙上實現(xiàn)“數(shù)字華容道”小游戲

    本篇文章教大家如何在鴻蒙上實現(xiàn)“數(shù)字華容道”小游戲。
    的頭像 發(fā)表于 12-26 09:52 ?1251次閱讀

    鴻蒙上開發(fā)“小蜜蜂”游戲

    小時候我們有個熟悉的游戲叫小蜜蜂。本文教大家在鴻蒙上學(xué)做這個小蜜蜂游戲。
    的頭像 發(fā)表于 04-03 11:27 ?1691次閱讀