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

 更新时间:2023年02月07日 15:12:04   作者:进击的Coders  
文件导入时大多数项目无法回避的问题,这两天深入学习了文件导入,在这里进行记录,使用到的技术是Springboot+Vue,前端组件使用el-upload

一、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.效果截图

总结

这两天的项目中,学习了Java导出数据,其中遇到坑及总结如下:

  • 导出时响应函数返回值必须为void。
  • 前端也需要进行处理,使用vue的this.download()即可。
  • 如果是普通的Springboot架构,导入可以直接使用MultipartFile。
  • 如果不能使用MultiPartFile,那么可以使用Part从request.getPart(“fileName”)的方式获取part,然后进一步解析part获取文件内容。
  • 后端可以将读取到的文件内容转换为字符串,使用BufferedRead和StringBuilder即可。
  • 前端可以读取文件的内容,使用FileReader和reader.onload()即可。
  • 如果如果单纯验证文件格式、大小或者名称是否正确,来判断是否终止文件上传任务,那么建议使用before-upload(如果返回false,或者promise返回reject,文件上传立即终止,并删除刚添加的文件)。如果需要对提交内容进行验证,根据验证结果做下一步操作,那么使用el-upload的on-change事件。

到此这篇关于Springboot与vue实现文件导入方法具体介绍的文章就介绍到这了,更多相关Springboot文件导入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现Excel批量导入数据

    Java实现Excel批量导入数据

    这篇文章主要为大家详细介绍了Java实现Excel批量导入数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • maven下载依赖失败问题及解决

    maven下载依赖失败问题及解决

    这篇文章主要介绍了maven下载依赖失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 基于SSM框架之个人相册示例代码

    基于SSM框架之个人相册示例代码

    本篇文章主要介绍了基于SSM框架之个人相册示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Java中Iterator(迭代器)的用法详解

    Java中Iterator(迭代器)的用法详解

    Java迭代器(Iterator)是 Java 集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。本文主要介绍了它的使用方法,希望对大家有所帮助
    2023-05-05
  • mybatis plus自动生成代码tinyint(1)自动转换为Boolean的问题及解决

    mybatis plus自动生成代码tinyint(1)自动转换为Boolean的问题及解决

    这篇文章主要介绍了mybatis plus自动生成代码tinyint(1)自动转换为Boolean的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java模板引擎Thymeleaf基本语法详解

    Java模板引擎Thymeleaf基本语法详解

    当开发Web应用程序时,我们通常需要使用模板引擎来构建和呈现动态内容,Thymeleaf是一个功能强大的Java模板引擎,它提供了丰富的表达式和标签,使得数据绑定、条件判断、循环迭代等操作变得轻松而灵活,本文就简单的给大家介绍一下Thymeleaf基本语法
    2023-08-08
  • 利用Java和c语言写一个计算器

    利用Java和c语言写一个计算器

    这篇文章我们就来分享如何利用Java和c语言来写一个计算器,文章附有代码详细说明,感兴趣得小伙伴可以参考下面文章得具体内容
    2021-10-10
  • Java由浅入深刨析继承

    Java由浅入深刨析继承

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
    2022-03-03
  • Java游戏开发之俄罗斯方块的实现

    Java游戏开发之俄罗斯方块的实现

    俄罗斯方块是一个最初由阿列克谢帕吉特诺夫在苏联设计和编程的益智类视频游戏。本文和大家分享了利用Java语言实现这一经典的小游戏的示例代码,需要的可以参考一下
    2022-05-05
  • SSM框架搭建图文教程(推荐)

    SSM框架搭建图文教程(推荐)

    下面小编就为大家带来一篇SSM框架搭建图文教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论