色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

鴻蒙上實現文件上傳功能

OpenHarmony技術社區 ? 來源:OST開源開發者 ? 作者:OST開源開發者 ? 2023-05-22 10:51 ? 次閱讀

此帖主要講解通過開發文檔示例代碼寫一個完整 Demo,方便初學者理解開發文檔內容。

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

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

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

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

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

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

效果如下:

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

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

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

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

所以 config.json 要添加的內容以下:

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

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

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

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

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

uploadFile(){
//上傳任務配置項
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'}
]
}

//將本地應用文件上傳至網絡服務器
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 由于文件上傳需要網絡,需要添加權限:ohos.permission.INTERNET。

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

所以 module.json5 要添加的內容以下:

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


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

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

aboutToAppear(){
letcacheDir=context.cacheDir;

//新建一個本地應用文件
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(){

//上傳任務配置項
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'}
]
}

//將本地應用文件上傳至網絡服務器
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 依賴。

內容如下:



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





前端調用接口文件 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);
}

}

后端業務邏輯代碼,也就是文件上傳處理邏輯 Service 代碼如下:

業務接口:

publicinterfaceFileService{
StandardResponseuploadFile(FileCriteriacriteria);

StringsaveFile(FileCriteriacriteria);
}
業務實現類:
@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("上傳文件結束!");
returnfilePath;
}

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

log.info("1.1.創建根目錄.");
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 跳轉。
@Controller
publicclassIndexController{

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

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

index.html 代碼如下:


單文件上傳

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

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

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

總結

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8611

    瀏覽量

    151237
  • API
    API
    +關注

    關注

    2

    文章

    1502

    瀏覽量

    62071
  • 開發者
    +關注

    關注

    1

    文章

    577

    瀏覽量

    17021
  • 鴻蒙
    +關注

    關注

    57

    文章

    2358

    瀏覽量

    42871
  • HarmonyOS
    +關注

    關注

    79

    文章

    1977

    瀏覽量

    30229

原文標題:鴻蒙上實現“文件上傳”功能

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙原生應用元服務開發-Web上傳文件

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

    如何在openmv中實現傳功能

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

    這個CMS系統可以同時選擇多個文件上傳,是怎么實現的?

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

    如何使用DGUS II的數據自動上傳功能

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

    利用java語言實現文件上傳功能

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

    基于Iframe內聯框架的異步文件上傳與刪除

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

    如何在java上傳和下載文件

    文件上傳在web應用中非常普遍,要在jsp環境中實現文件上傳功能是非常容易的,因為網上有許多用java開發的
    發表于 11-13 08:00 ?11次下載

    java Web如何實現文件上傳與下載

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

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

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

    鴻蒙上使用Python進行物聯網編程

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

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

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

    如何使用DGUS II的數據自動上傳功能

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

    HarmonyOS應用開發okhttp3.0快速集合文件上傳

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

    鴻蒙上實現“數字華容道”小游戲

    本篇文章教大家如何在鴻蒙上實現“數字華容道”小游戲。
    的頭像 發表于 12-26 09:52 ?1252次閱讀

    鴻蒙上開發“小蜜蜂”游戲

    小時候我們有個熟悉的游戲叫小蜜蜂。本文教大家在鴻蒙上學做這個小蜜蜂游戲。
    的頭像 發表于 04-03 11:27 ?1702次閱讀
    主站蜘蛛池模板: 亚洲精品不卡视频| 色噜噜狠狠色综合欧洲| 暖暖 免费 高清 日本 在线| 无限资源在线观看高清| 扒开校花粉嫩小泬喷潮漫画| 旧里番YY6080在线播放| 亚洲青青草| 好姑娘BD高清在线观看免费| 洗濯屋H纯肉动漫在线观看| 灌满内射HP1V1| 少妇两个奶头喷出奶水了怎么办| 超碰caopro熟女m超碰分类| 青娱乐在线一区| 成人亚洲视频在线观看| 人妻兽虐曲| 高h全肉图| 小便japanesewctv| 红色机尾快播| 伊人色综合久久天天网| 巨大乳hdbbw| 99久久爱看免费观看| 欧美特级另类xxx| 俄罗斯6一9泑女网站| 小黄文纯肉污到你湿| 好好的曰com久久| 在线亚洲中文精品第1页| 男人电影天堂手机| 成人亚洲视频| 亚洲精品国产高清不卡在线| 久久成人免费观看草草影院| 中字幕久久久人妻熟女天美传媒| 免费国产黄线在线播放| 波多野结衣教师系列6| 无套内射无矿码免费看黄| 好吊射视频988gaocom| 666永久视频在线| 日本一本在线播放| 狠狠躁日日躁人人爽| 999久久久国产精品蜜臀AV| 色橹橹欧美在线观看视频高清| 国产人妻XXXX精品HD电影|