Springboot与vue实现文件导入方法具体介绍

作者:进击的Coders 时间:2023-10-31 12:31:37 

一、Java后端使用MultipartFile

@PostMapping(value = "/upload")
   public String upload(@RequestParam("file") MultipartFile multipartFile) {
       return FileUploadUtil.upload(multipartFile);
   }

如果使用Springboot架构,直接使用MultipartFile工具即可,后端拿到MultipartFile对象之后,对其进一步处理就能拿到数据,或者存入数据库,或者保存到本地都可以。

二、Java后端直接从request中读取并转换为字符串

Part importFile = request.getPart("file");
InputStream inputstream = importFile.getInputStream();
BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputstream, "UTF-8"));
StringBuilder stringBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null) {
   stringBuilder.append(inputStr);
}
String s = stringBuilder.toString();

直接从request中读取需要使用Part类,从request中根据名称获取到part对象,然后再转换为流的形式,之后使用BufferedReader流读取器,逐行读取文件内容并添加到字符串构造器中,生成字符串。

三、Java后端直接从request中读取并存入本地文件

HttpServletRequest request = context.getRequest();
FileOutputStream fos = new FileOutputStream("C:\\Users\\Junhao\\Desktop\\import.json");
byte[] buffer = new byte[1024];
int len;
Part file = request.getPart("file");
InputStream inputstream = file.getInputStream();
while ((len = inputstream.read(buffer)) != -1){
   fos.write(buffer, 0, len);
}
fos.close();
inputstream.close();
String responseString = readInputStream(inputstream);
System.out.println(responseString);
BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputstream, "UTF-8"));
StringBuilder stringBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null) {
   stringBuilder.append(inputStr);
}
String s = stringBuilder.toString();
Object parse = JSON.parse(s);

四、前端使用el-upload

由于要求在上传之前进行检验,然后根据检验的结果,对于冲突的实体,逐项选择覆盖已有实体,或者使用原来实体,这相对于单纯的文件上传,提高了难度

1.el-upload使用

<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
     <el-upload
       ref="upload"
       :limit="1"
       accept=".json"
       :headers="upload.headers"
       :action="upload.url"
       :disabled="upload.isUploading"
       :on-progress="handleFileUploadProgress"
       :on-success="handleFileSuccess"
       :on-change="handleChange"
       :before-remove="handleRemove"
       :auto-upload="false"
       drag
       :data="upload.uploadData"
     >
       <i class="el-icon-upload"></i>
       <div class="el-upload__text">
         将文件拖到此处,或
         <em>点击上传</em>
       </div>
       <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“json”格式文件!</div>
     </el-upload>
       <div v-if="showImportCheckRes" style="margin-top: 8px">
         <el-tabs active-name="thing">
             <el-tab-pane name="thing" label="事物" style="height: 130px;" class="scrollbar">
               <el-scrollbar style="height: 100%">
                 <el-form label-position="left">
                   <div v-for="item in importCheckRes.existThings">
                     <el-form-item :label="item.code" label-width="160px">
                       <el-radio-group v-model="item.value">
                         <el-radio :label="0">暂不导入</el-radio>
                         <el-radio :label="1">覆盖</el-radio>
                       </el-radio-group>
                     </el-form-item>
                   </div>
                 </el-form>
               </el-scrollbar>
             </el-tab-pane>
             <el-tab-pane name="thingTemplate" label="事物模板" style="height: 130px;" class="scrollbar">
               <el-scrollbar style="height: 100%">
                 <el-form label-position="left">
                   <div v-for="item in importCheckRes.existThings">
                     <el-form-item :label="item.code" label-width="160px">
                       <el-radio-group v-model="item.value">
                         <el-radio :label="0">暂不导入</el-radio>
                         <el-radio :label="1">覆盖</el-radio>
                       </el-radio-group>
                     </el-form-item>
                   </div>
                 </el-form>
               </el-scrollbar>
             </el-tab-pane>
           <el-tab-pane name="dataModel" label="数据模型" style="height: 130px;" class="scrollbar">
             <el-scrollbar style="height: 100%">
               <el-form label-position="left">
                 <div v-for="item in importCheckRes.existDataModels">
                   <el-form-item :label="item.code" label-width="160px">
                     <el-radio-group v-model="item.value">
                       <el-radio :label="0">暂不导入</el-radio>
                       <el-radio :label="1">覆盖</el-radio>
                     </el-radio-group>
                   </el-form-item>
                 </div>
               </el-form>
             </el-scrollbar>
           </el-tab-pane>
           <el-tab-pane name="modelTag" label="模型标签" style="height: 130px;" class="scrollbar">
             <el-scrollbar style="height: 100%">
               <el-form label-position="left">
                 <div v-for="item in importCheckRes.existModelTags">
                   <el-form-item :label="item.code" label-width="160px">
                     <el-radio-group v-model="item.value">
                       <el-radio :label="0">暂不导入</el-radio>
                       <el-radio :label="1">覆盖</el-radio>
                     </el-radio-group>
                   </el-form-item>
                 </div>
               </el-form>
             </el-scrollbar>
           </el-tab-pane>
         </el-tabs>
       </div>
     <div slot="footer" class="dialog-footer">
       <el-button type="primary" @click="submitImport" size="mini">确 定</el-button>
       <el-button @click="upload.open = false" size="mini">取 消</el-button>
     </div>
   </el-dialog>

2.on-change验证文件内容

handleChange(file){
     if (this.importStatus === 1){
       return;
     }
     let that = this
     let raw = file.raw
     const reader = new FileReader()
     reader.readAsText(raw, 'UTF-8')
     reader.onload=async function(evt){
       let dataJson = JSON.parse(evt.target.result)
       const Entities = dataJson.Entities
       const entityCode = {}
       Object.keys(Entities).forEach(item=>{
         const tempArray = []
         Object.values(Entities[item])[0].forEach(i=>{
           tempArray.push(i.code)
         })
         that.$set(entityCode, item, JSON.parse(JSON.stringify(tempArray)))
       })
       that.$nextTick(()=>{
         importCheck(entityCode).then(res=>{
           that.importCheckRes = res.data
           that.showImportCheckRes = true
         })
       })
     }
   },

在前端先解析文件,读取JSON数据,然后将要导入的code发送到后端,返回哪些是已有的,然后在前端进行覆盖或者暂不导入的选择,选择完成之后点击确定,携带选择的结果进行导入

submitImport() {
     const tempJson = JSON.parse(JSON.stringify(this.importCheckRes))
     const importCheckRes = {}
     Object.keys(tempJson).forEach(item=>{
       const tempArray = []
       tempJson[item].forEach(i=>{
         if (i.value === 1){
           tempArray.push(i.code)
         }
       })
       this.$set(importCheckRes, item, tempArray);
     })
     this.$set(this.upload, 'uploadData', { importCheckRes: JSON.stringify(importCheckRes) })
     this.$nextTick(()=>{
       this.$refs.upload.submit()
     })
   },

3.效果截图

Springboot与vue实现文件导入方法具体介绍

  • 导出时响应函数返回值必须为void。

  • 前端也需要进行处理,使用vue的this.download()即可。

  • 如果是普通的Springboot架构,导入可以直接使用MultipartFile。

  • 如果不能使用MultiPartFile,那么可以使用Part从request.getPart(&ldquo;fileName&rdquo;)的方式获取part,然后进一步解析part获取文件内容。

  • 后端可以将读取到的文件内容转换为字符串,使用BufferedRead和StringBuilder即可。

  • 前端可以读取文件的内容,使用FileReader和reader.onload()即可。

  • 如果如果单纯验证文件格式、大小或者名称是否正确,来判断是否终止文件上传任务,那么建议使用before-upload(如果返回false,或者promise返回reject,文件上传立即终止,并删除刚添加的文件)。如果需要对提交内容进行验证,根据验证结果做下一步操作,那么使用el-upload的on-change事件。

来源:https://blog.csdn.net/qq_43403676/article/details/126924324

标签:Springboot,文件,导入
0
投稿

猜你喜欢

  • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    2023-04-19 15:01:55
  • Android控件CardView实现卡片布局

    2022-12-05 02:10:32
  • Java 继承与多态的深入理解

    2023-10-05 04:25:41
  • Java如何生成4位、6位随机数短信验证码(高效实现)

    2023-01-24 18:05:20
  • Android NDK开发(C语言基本数据类型)

    2022-06-11 07:57:19
  • C# ListBox中的Item拖拽代码分享

    2022-04-12 14:06:41
  • 如何在Spring Boot中使用MQTT

    2023-10-08 20:39:13
  • Android蓝牙服务启动流程分析探索

    2023-12-20 17:45:35
  • 详解Java8 CompletableFuture的并行处理用法

    2023-07-27 11:48:06
  • Java 提取照片的EXIF信息批量重命名

    2023-10-05 14:11:28
  • 解决IDEA中快捷键Alt+Enter不能使用的问题

    2022-09-14 07:54:07
  • Gradle:修改默认的Build配置文件名方式

    2023-11-28 20:18:01
  • Java函数式编程(六):Optional

    2021-07-04 21:44:05
  • MyBatis-Plus通过version机制实现乐观锁的思路

    2023-09-16 06:58:27
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    2021-11-01 15:06:48
  • 通过实例学习JAVA对象转成XML输出

    2023-01-14 15:25:35
  • 解决MySQL忘记密码问题的方法

    2022-04-05 07:55:43
  • C#实现按照指定长度在数字前补0方法小结

    2023-02-23 09:42:32
  • Android ListView UI组件使用说明

    2022-06-14 16:04:09
  • C# Winform 子窗体访问父级窗体的控件和属性

    2022-08-15 04:37:06
  • asp之家 软件编程 m.aspxhome.com