今日讯!ArkTS(3.0与3.1)前端和SpringBoot后端文件上传示例(Request.upload) - 综合 -

当前位置:首页  >  综合  > 正文

今日讯!ArkTS(3.0与3.1)前端和SpringBoot后端文件上传示例(Request.upload)

今日讯!ArkTS(3.0与3.1)前端和SpringBoot后端文件上传示例(Request.upload)
2023-05-15 17:02:02 来源:清一色财经

此帖主要讲解通过开发文档示例代码写一个完整Demo,方便初学者理解开发文档内容。

想了解更多关于开源的内容,请访问:


【资料图】

清一色开源基础软件社区

https://ost.51cto.com

前言

此帖主要讲解通过开发文档示例代码写一个完整Demo,方便初学者理解开发文档内容,大家都知道3.0使用的是FA模式、3.1使用的是Stage模式,所以同样是文件上传,代码写法上有些不一样,开发文档也不一样,比如在3.1下,可以在HarmonyOS Developer > 文档 > 指南 > 开发下找到文件上传下载示例代码,而在3.0下,就找不到相应指南开发了,只能在HarmonyOS Developer > 文档 > API参考 > ArkTS API参考找到@ohos.request (上传下载)文档,为了实现一个完整文件上传Demo,后端是少不了的,这里我使用了我平常工作中用到的SpringBoot开发后端,为了验证文件上传接口是否正常,使用Thymeleaf写一个简单的前端页面来测试接口,先保证后端文件上传接口是正常的,这样其它前端调用就可以排除后端文件上传接口问题,专心调试前端代码,希望小伙伴通过此贴学习到文件上传同时,参考此思路也可以自己完成其它示例代码完成Demo。

效果

知识点

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和调用后端接口,代码如下:
import request from "@ohos.request";import featureAbility from "@ohos.ability.featureAbility";import fileio from "@ohos.fileio";@Entry@Componentstruct Index {  @State btnLabel: string = "提交文件"  private uploadTask: request.UploadTask  aboutToAppear() {    // 获取应用文件路径    var context = featureAbility.getContext();    context.getCacheDir().then((data) => {      console.info("xx ======================>getCacheDirPromsie====================>");      console.info("xx ====>data====>" + JSON.stringify(data));      // 新建一个本地应用文件      let fd = fileio.openSync(data + "/test.txt", 0o102, 0o666);      fileio.writeSync(fd, "upload file test by army");      fileio.closeSync(fd);    });  }  aboutToDisappear() {    this.uploadTask.off("progress")  }  uploadFile() {    // 上传任务配置项    let uploadConfig = {      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("xx Success to request the upload. Cause: " + JSON.stringify(data));          // uploadTask = data;          this.uploadTask.on("progress", (uploadedSize, totalSize) => {            console.info("xx 上传进度值是:" + uploadedSize + ", 总大小:" + totalSize)          })        }).catch((err) => {        this.btnLabel = "文件上传失败"        console.error("xx Failed to request the upload. Cause: " + JSON.stringify(err));      })    } catch (err) {      this.btnLabel = "文件上传失败"      console.error(`xx Invoke uploadFile failed, code is ${err.code}, message is ${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和调用后端接口,代码如下:
import common from "@ohos.app.ability.common";import fs from "@ohos.file.fs";import request from "@ohos.request";import hash from "@ohos.file.hash";// 获取应用文件路径let context = getContext(this) as common.UIAbilityContext;@Entry@Componentstruct Index {  @State btnLabel: string = "提交文件"  private uploadTask: request.UploadTask  aboutToAppear() {    let cacheDir = context.cacheDir;    // 新建一个本地应用文件    let file = fs.openSync(cacheDir + "/test.txt", fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);    fs.writeSync(file.fd, "upload file test by API9");    fs.closeSync(file);  }  aboutToDisappear() {    this.uploadTask.off("complete")  }  uploadFile() {    // 上传任务配置项    let uploadConfig = {      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 (let i = 0; i < taskStates.length; i++) {              console.info(`xx upload complete taskState: ${JSON.stringify(taskStates[i])}`);            }          });        })        .catch((err) => {          this.btnLabel = "文件上传失败"          console.error(`xx Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);        })    } catch (err) {      this.btnLabel = "文件上传失败"      console.error(`xx Invoke uploadFile failed, code is ${err.code}, message is ${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    Demo project for Spring Boot            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")@Slf4jpublic class FileController {    @Autowired    FileService fileService;    @PostMapping("/upload")    public StandardResponse upload(String fileId, MultipartHttpServletRequest multiPartRequest) {        log.info("**Upload File Controller!");        FileCriteria criteria = new FileCriteria();        criteria.setFileId(fileId);        try {            //upload file            Iterator itr =  multiPartRequest.getFileNames();            MultipartFile mpf = null;            while(itr.hasNext()){                mpf = multiPartRequest.getFile(itr.next());                break;            }            byte[] fileByteArr = null;            if (null != mpf && !mpf.isEmpty()) {                String originalFileName = mpf.getOriginalFilename();                log.info(originalFileName);                criteria.setFileName("");                String fileExtension = FilenameUtils.getExtension(originalFileName);                criteria.setFileExtension(fileExtension);                fileByteArr = mpf.getBytes();                criteria.setFileByteArray(fileByteArr);                criteria.setFileName(originalFileName);            }        } catch (IOException e) {            e.printStackTrace();            log.error(e.getMessage());        }        return fileService.uploadFile(criteria);    }}
后端业务逻辑代码,也就是文件上传处理逻辑Service代码如下:(1)业务接口:
public interface FileService {    StandardResponse uploadFile(FileCriteria criteria);    String saveFile(FileCriteria criteria);}

(2)业务实现类:

@Service@Slf4jpublic class FileServiceImpl implements FileService {    @Value("${project.root.path}")    private String rootPath = "rootPath";    @Value("${project.baseUrl}")    private String baseUrl;    @Override    public StandardResponse uploadFile(FileCriteria criteria) {        String filePath = this.saveFile(criteria);        String imgPath = baseUrl + "filePath/" + filePath;        StandardResponse standardResponse = new StandardResponse();        standardResponse.setSuccess(true);        standardResponse.setStatusCode("100");        standardResponse.setStatusDesc("上传成功");        standardResponse.setData(imgPath);        return standardResponse;    }    @Override    public String saveFile(FileCriteria criteria) {        log.info("上传文件开始!");        String pictureId = IdUtils.getId("FP");        String fileName = pictureId + "." + criteria.getFileExtension();        criteria.setFileName(fileName);        String filePath = sourceFile(criteria);        log.info("File Path: " + filePath);        log.info("上传文件结束!");        return filePath;    }    private String sourceFile(FileCriteria criteria) {        byte[] attachmentFileByteArray = criteria.getFileByteArray();        if (null != attachmentFileByteArray) {            log.info("1.1.创建根目录.");            String basePath = rootPath + this.genDatePath();            File basePathFolder = new File(basePath);            if (!basePathFolder.exists()) basePathFolder.mkdirs();            log.info("根目录: " + basePath);            File file = new File(basePath + File.separator + criteria.getFileName());            log.info("1.2.保存源文件 - 绝对路径: " + file.getAbsolutePath());            try {                FileCopyUtils.copy(attachmentFileByteArray, file);                log.info("1.3.1.保存源文件 - 保存成功 !!!");                String relativePath = this.genDatePath() + File.separator + criteria.getFileName();                return relativePath;            } catch (IOException e) {                log.info("1.3.2.保存源文件 - 保存失败 !!!");                file.deleteOnExit();                return "";            }        }        return "";    }    private String genDatePath(){        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");        String yyyyMMdd = sdf.format(new Date());        return yyyyMMdd;    }}
配置文件
server:  port: 8740project:  root:    path: /var/tomcat/file-manage/filePath/  baseUrl: http://111.114.238.134:8740/
访问域名或IP加端口访问到Thymeleaf页面,要添加一个Controller跳转
@Controllerpublic class IndexController {    @GetMapping("/")    public String Index() {        return "index";    }}
在templates目录下创建index.htm页面文件,这里的index名要和上面Controller返回“index”名一致,才能跳转过去,index.html代码如下:
        文件上传

单文件上传

上面图片就是Thymeleaf页面,上传文件成功后效果。

总结

通过此贴学习到文件上传3.0与3.1的不同处,同时也学习到了后端开发流程,其实写这个贴子之前,是一个小伙伴问到我关于文件上传问题,由于之前我写的实例里,也没有用到文件上传功能,于是我就用最新API9也就是Stage模式写了一个Demo给他参考,然后他通过参考我的Demo,学会了,可惜他现在开发的项目是用API8的,由于开发模式不一样,他遇到了问题,于是我在用API8写了一个Demo给他参考,最后他的项目也实现了文件上传。

文章相关附件可以点击下面的原文链接前往下载:

https://ost.51cto.com/resource/2729。

https://ost.51cto.com/resource/2730。

https://ost.51cto.com/resource/2731。

想了解更多关于开源的内容,请访问:

清一色开源基础软件社区

https://ost.51cto.com

标签:

(责任编辑:news01)
要闻速递:电池级碳酸锂九连涨 机构:锂电股价或领先于锂价修复(附概念股)

要闻速递:电池级碳酸锂九连涨 机构:锂电股价或领先于锂价修复(附概念股)

5月11日下午,青海盐湖蓝科锂业举行了600万吨工业级碳酸锂拍卖,最终以24 1万至25 1万元 吨成交。这一价格
05-12 16:18:24
新华医疗涨停 当前速递

新华医疗涨停 当前速递

新华医疗涨停
05-12 15:53:45
环球快看:孕期蛋白质如何补充?

环球快看:孕期蛋白质如何补充?

孕妇可通过日常饮食来补充蛋白质:首先,孕妈是可以通过日常饮食来补充蛋白质的,而且这日常饮食是补充蛋白
05-11 19:33:12
曹纪平_对于曹纪平简单介绍|每日消息

曹纪平_对于曹纪平简单介绍|每日消息

1、曹纪平:1998年加盟中国人寿,2003年至2005年连续3年获全省销售冠军,全国第二届“保险之星”获得者。2、美国
05-11 18:04:41
广交会第三期箱包展对中国箱包行业的启示

广交会第三期箱包展对中国箱包行业的启示

箱包行业一直是中国制造业的一个重要领域,具有较高的市场竞争力和出口潜力。广交会第三期以箱包为主题,为
05-11 17:48:40
营销必修课:理想汽车不爱充值?1个丰田汽车的销售费用率≈2.6个比亚迪|世界热议

营销必修课:理想汽车不爱充值?1个丰田汽车的销售费用率≈2.6个比亚迪|世界热议

如果说,特斯拉这类行业开创者的先天优势很难模仿,也学不来马斯克、李想等亲自下场为自己代言的画风,那么
05-11 17:01:05
许昌市总工会组织开展服务新业态劳动者法律宣传活动_今日热文

许昌市总工会组织开展服务新业态劳动者法律宣传活动_今日热文

中工网讯为进一步增强新业态劳动者法律意识,5月9日,河南省许昌市总工会整合资源,由工会法律工作者、新业
05-11 16:34:25
江淮瑞风首款概念车RF-M精彩亮相上海车展_今日热门

江淮瑞风首款概念车RF-M精彩亮相上海车展_今日热门

4月18日,2023第二十届上海国际汽车工业展览会在上海国家会展中心拉开帷幕,江淮乘用车也携旗下多款重磅产
05-11 16:20:53
中原传媒:2022年 公司在数字教育、数据库出版、电商等领域均取得了预期成效

中原传媒:2022年 公司在数字教育、数据库出版、电商等领域均取得了预期成效

每经AI快讯,有投资者在投资者互动平台提问:2022年,中原传媒在数字化转型方面有哪些成效?中原传媒(0007
05-11 15:39:50
世界今头条!疯狂梗传奇葩菜名炒出8道菜攻略

世界今头条!疯狂梗传奇葩菜名炒出8道菜攻略

疯狂梗传奇葩菜名是最新的脑洞关卡,大家需要根据菜名提示和食材组合,炒出8道菜。逗游网为大家带来了疯狂
05-11 15:23:34
成都惠蓉保报销费用怎么计算?

成都惠蓉保报销费用怎么计算?

成都惠蓉保报销费用怎么计算?符合“惠蓉保”保障责任一、保障责任二的费用如何计算?答:保障责任一包含...
05-11 15:03:13
世界报道:佩顿谈连续两场首发:你永远不会离开科尔的轮换 你只需做好准备

世界报道:佩顿谈连续两场首发:你永远不会离开科尔的轮换 你只需做好准备

NBA季后赛次轮G5,勇士121-106击败湖人,总比分来到2-3。赛后,佩顿二世接受了采访。谈到连续两场获得首发
05-11 13:58:59
当前速看:中国经济是今年全球增长的一大亮点——访IMF第一副总裁

当前速看:中国经济是今年全球增长的一大亮点——访IMF第一副总裁

新华社北京5月10日电题:中国经济是今年全球增长的一大亮点——访IMF第一副总裁新华社记者于佳欣、王希...
05-11 13:26:59
A股:5天4个涨停板!股民:卖飞好像错过了一切!

A股:5天4个涨停板!股民:卖飞好像错过了一切!

其实,如果你仔细看下近期大涨的个股,你就会发现“横有多长竖有多高”的股市真理。三五年时间的横盘,...
05-11 12:39:35
如何保存新鲜小辣椒 保 怎样存新鲜小辣椒 全球讯息

如何保存新鲜小辣椒 保 怎样存新鲜小辣椒 全球讯息

1、干制法:将辣椒用清水冲洗干净后,晾干,然后放到太阳底下晒,晒到9成干左右,在辣椒的叶柄处用细线将辣
05-11 12:13:09
【环球报资讯】31℃!周末气温或创今年新高!夏天的脚步近了

【环球报资讯】31℃!周末气温或创今年新高!夏天的脚步近了

11日天气最高温度22℃10日白天多云为主全天气温在14-23℃偏东风3-4级相对湿度85%-35%不热不燥是非常舒适的
05-11 11:38:48
“水韵江苏”新版文旅宣传片登陆央视 扬州元素精彩亮相|环球微速讯

“水韵江苏”新版文旅宣传片登陆央视 扬州元素精彩亮相|环球微速讯

扬州网讯(通讯员伏京京李丹丹记者居小春)让江苏旅游更有“诗意”,让江苏文化走向“远方”。5月8日起...
05-11 11:17:18
美国经济不利、AI大战太烧钱,微软今年不给全职员工加薪 环球消息

美国经济不利、AI大战太烧钱,微软今年不给全职员工加薪 环球消息

在去年为部分全职员工加薪后,微软今年未对全职员工加薪。经济状况和对人工智能领域的投资,是公司作出这一
05-11 11:02:13
山东济宁:缤纷社团 多彩校园

山东济宁:缤纷社团 多彩校园

5月10日,济宁市第七中学美术社团学生在制作脸谱。5月10日,济宁市第七中学与竹共舞社团学生在排练。5月10
05-11 10:42:22
工作了失业金就停止领取了吗?不能领取失业金的情况有哪些?

工作了失业金就停止领取了吗?不能领取失业金的情况有哪些?

找到新工作失业金就终止了吗哪些情况下不能领取失业保险金接下来跟社保网小编一起来看看最新相关资讯吧。据
05-11 10:03:50
保立佳:5月10日获融资买入19.42万元,占当日流入资金比例6.84%|今日要闻

保立佳:5月10日获融资买入19.42万元,占当日流入资金比例6.84%|今日要闻

同花顺数据中心显示,保立佳5月10日获融资买入19 42万元,占当日买入金额的6 84%,当前融资余额2174 89万元
05-11 09:46:09
qq群怎么升级5000人_qq群怎么升级|时讯

qq群怎么升级5000人_qq群怎么升级|时讯

1、QQ群聊如何升级到QQ群,单点打开QQAPP,如图。2、点击QQAPP,然后点击界面下方的联系人,如图。3、【联系人
05-11 09:18:11
厦门今年首场土拍揽金101亿元 88家房企摇号抢一宗地

厦门今年首场土拍揽金101亿元 88家房企摇号抢一宗地

本报记者王丽新5月10日,厦门举行2023年首场土拍,共出让3宗宅地,起拍总价为91 9亿元,最终共计揽金101 45
05-11 08:42:20
世界观点:王者荣耀5.11更新:戈娅/后羿削弱,米莱狄/刘禅加强,新皮肤上线

世界观点:王者荣耀5.11更新:戈娅/后羿削弱,米莱狄/刘禅加强,新皮肤上线

王者荣耀正式服将在5月11日上午9点开启不停机更新,本次更新的主要内容有:1、四位英雄调整;2、新皮肤上线
05-11 08:13:44
华夏基金管理有限公司关于旗下基金投资非公开发行股票的公告|当前短讯

华夏基金管理有限公司关于旗下基金投资非公开发行股票的公告|当前短讯

华夏基金管理有限公司(以下简称“本公司”)旗下基金参加了索通发展股份有限公司(证券简称:索通发展...
05-11 07:17:22
天天看点:四川省市场监管局建立放心舒心消费行业服务地方标准

天天看点:四川省市场监管局建立放心舒心消费行业服务地方标准

5月10日,记者从四川省市场监管局获悉,近年来,四川省市场监管局以“消费环境安全度、经营者诚信度、消...
05-11 06:16:15
全球消息!百利科技(603959):5月10日北向资金增持9.24万股

全球消息!百利科技(603959):5月10日北向资金增持9.24万股

5月10日北向资金增持9 24万股百利科技。近5个交易日中,获北向资金增持的有4天,累计净增持22 9万股。近20
05-11 05:15:52
微信群主怎么删除聊天记录让所有人都看不到_微信群主怎么删除聊天记录

微信群主怎么删除聊天记录让所有人都看不到_微信群主怎么删除聊天记录

1、微信群主无法清空其他人的聊天记录。2、只能删除自己电脑上的聊天记录。3、聊天记录是保存在终端的,也
05-11 04:05:01
全球快资讯:维金斯:生涯早期确实想向LBJ证明自己 他们有戒指我现在也有

全球快资讯:维金斯:生涯早期确实想向LBJ证明自己 他们有戒指我现在也有

维金斯:生涯早期确实想向LBJ证明自己他们有戒指我现在也有,库里,维金斯,lbj,勒布朗詹姆斯,克利夫兰骑士,奥
05-11 01:06:57
环球今头条!吉利帝豪gs二手车价格_吉利gs帝豪与吉利x6

环球今头条!吉利帝豪gs二手车价格_吉利gs帝豪与吉利x6

1、远景  优点:  空间大,保养便宜,购置便宜,适合县镇城乡结合部不求虚夸,只求实在的人群购买。2、
05-10 23:06:16

为您推荐

精彩推送