java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端

这篇具有很好参考价值的文章主要介绍了java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.背景

文件上传项目可参考:点击预览

1.最简单也是最普遍的做法是form表单提交,其实前端提交到后端也是难以离开form表单提交,
一般有两种方式来处理文件、图片上传:

  1. 先上传,获取返回路径,再整个表单提交后端保存;
  2. 普通数据与文件图片同时提交后端,由后端处理

优点比较

  1. 第一种可以优先处理文件上传,异步处理,节省用户提交loading的时间,特别是一些大文件
  2. 第二种在最后提交才进行文件处理,没有脏数据,节省了文件服务器空间和流量

缺点比较,可以说刚好相反,第一种只有一选择文件,马上就上传,用户可以在最后提交之前一直change文件,就可能不断上传了一些没必要的文件图片,造成了各种文件脏数据,除非通过某些逻辑去删除这些脏文件(定时刷数据或提交的时候判断用户最终保存的数据来删除脏数据)

这里作者采取第二种方式,相对于第一种,实现难度稍微大些

二.前端html实现

element上传官方文档
elupload上传多张图片给后端,前端开发它不香么,Java、后端,vue.js,java,javascript,elementui,前端
on-success、on-error其实就是上面说的第一种方式才会用到的,作者感觉element就是推荐用异步的方式来实现的,通过action提交到指定上传接口

前端实现源码

<el-form-item label="图片" :required="form.postsType !== '2'">
              <el-upload
                action=""
                list-type="picture-card"
                :auto-upload="false"
                :limit="9"
                :before-upload="beforeUpload"
                :on-change="handleChange"
                :on-preview="handlePictureCardPreview"
                :disabled="disabled"
                :on-remove="handleRemove">
                <i class="el-icon-plus"></i>
              </el-upload>
              <div style="font-size: 12px;color: #666;">
                只能上传jpg/png文件,且不超过 2MB,最多上传 9 张图片
              </div>
              <el-dialog :visible.sync="dialogVisible">
                <img width="100%" :src="dialogImageUrl" alt="">
              </el-dialog>
            </el-form-item>

同时定义属性

	 dialogImageUrl: '',//窗口预览图片路径
     dialogVisible: false,//预览窗口是否打开
     disabled: false,//是否禁用上传操作

源码解析:

  • :limit=“9” //最多可上传9张图片
  • :before-upload=“beforeUpload”//上传之前,即选择图片后调用方法
  • :on-change=“handleChange”//选择图片上传调用方法
  • :on-preview=“handlePictureCardPreview”//预览图片调用方法
  • :disabled=“disabled”//是否禁用上传操作
  • :on-remove=“handleRemove”//上传已选择的图片

三.js方法实现

js源码

	beforeUpload(file) {
        const isLt2M = file.size / 1024 / 1024 < 2;
        if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过 2MB!')
        }
        return isLt2M
      },
      handleRemove(file, fileList) {
        this.form.files = fileList;
        console.info(this.form);
      },
      handleChange(file, fileList){
        this.form.files = fileList;
        console.info(this.form);
      },
      handlePictureCardPreview(file) {
        this.dialogImageUrl = file.url;
        this.dialogVisible = true;
      },

源码解析:
方法意义上面已经说过了,其中this.form.files定义为一个数组,暂存上传的文件

form: {
  files: [],
  title: ''
},

组装数据请求上传到后端:

let formData = new FormData();
for (const file of this.form.files) {//多个文件全部都放到files
  if(file.raw) {
    formData.append('files', file.raw);
  }
}
formData.append('title',this.form.title);
add(formData).then(res => {
  this.loading = false;
  if(res.code === 200){
    this.$message.success(res.msg);
  }
},error => {
  this.loading = false;
})

四.java后端处理

controller:

	@PostMapping("/add")
    @ApiOperation(value = "添加", notes = "添加")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "title", value = "标题", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "files", value = "上传图片列表", required = false, dataType = "MultipartFile[]", paramType = "query")
    })
    public Result<Posts> add(
            @RequestParam("title")  String title,
            @RequestParam(value = "files",required = false) MultipartFile[] files
            ) {
        PostsReq postsReq = new PostsReq();
        postsReq.setTitle(title);
        postsReq.setFiles(files);
        return postsService.add(JwtUtil.getUserId(),postsReq);
    }

源码解析:
作者一开始是想着用@RequestBody注解来接收整个数据对象的,但是这样的话会报错,具体错误信息作者没有记录下来,大概的意思就是MultipartFile类型不支持,没有构造方法那一类的,然后看了一下MultipartFile的源码

居然是interface的~,原来如此(理所当然认为应该是class的,哈哈哈,难怪),有更加深入研究的同学麻烦留言也分享一下,感谢!

elupload上传多张图片给后端,前端开发它不香么,Java、后端,vue.js,java,javascript,elementui,前端
java文件上传处理实现:

    public String uploadImage(MultipartFile file) {
        if (file == null)
            throw new BizException("图片不能为空");

        //得到上传文件的文件名
        String fileName = file.getOriginalFilename();
        //以传入的字符串开头,到该字符串的结尾,前开后闭
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        long size = file.getSize();
        double mul = NumberUtil.div(size, (1024 * 1024), 2);
        // 自定义异常
        if (mul > 2)
            throw new BizException("图片大小不能大于2M");
        if (!isImage(suffixName))
            throw new BizException("不是图片格式");
        // 这里可以用uuid等 拼接新图片名
        String newFileName = UUID.randomUUID().toString().replace("-", "") + suffixName;
        // 创建路径
        String destFileName = fileUploadConfig.getImageRealPath() + File.separator + newFileName;
        File destFile = new File(destFileName);
        if (!destFile.getParentFile().exists())
            destFile.getParentFile().mkdirs();
        try {
            //将图片保存到文件夹里
            file.transferTo(new File(destFileName));
        } catch (IOException e) {
            e.printStackTrace();
            throw new BizException("图片上传错误");
        }
        //返回相对路径存储
        return fileUploadConfig.getImageMapperPath() + newFileName;
    }

    /**
     * 传进 .jpg  类似的格式 判断是否时图片格式
     * @param suffixName 图片格式后缀
     * @return
     */
    public static boolean isImage(String suffixName) {
        List<String> strings = Arrays.asList(".webp", ".png", ".jpg", ".jif", ".jpeg");
        return strings.contains(suffixName);
    }

有更加好的实现方式的,欢迎留言,大家分享,共同学习、共同进步~文章来源地址https://www.toymoban.com/news/detail-771757.html

到了这里,关于java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue上传图片功能【element ui】

    路径那里是axios请求根路径和接口文档里面后端给的路径拼接的 只要看到这个就证明这张图片并没有上传成功 我已经通过axios的request拦截器为每一个请求都挂载了一个Authorization也就是token,挂载了这个也就说明每一个axios请求都会追加一个token 但是为什么配置了token还是显示

    2024年02月12日
    浏览(40)
  • vue3 element组件上传图片

    在 Vue 3 中使用 Element 组件库进行图片上传,您需要使用 Element 的 Upload 组件。这个组件可以方便地实现文件上传功能,包括图片上传。 以下是一个简单的示例,演示如何在 Vue 3 中使用 Element 的 Upload 组件进行图片上传: 首先,确保您已经安装并配置了 Element 组件库。您可以

    2024年02月15日
    浏览(28)
  • Element-ui配合vue上传图片

    这里为大家介绍饿了吗ui配合vue封装一个图片上传的组件  首先大家先看一个饿了吗ui文档的各个钩子函数的介绍! on-preview这个属性我们一般用来预览图片时使用 on-remove这个属性时文件被删除时执行 一般我们在这里面进行数组的筛选 让它保证为最新数组 on-change当文件被选择

    2024年02月09日
    浏览(51)
  • vue+element ui实现图片上传并拖拽进行图片排序

    用到的技术栈: vue2 element Ui vue-dragging 第一步: 安装 第二步: 引入 Video_23-11-13_10-17-30 end~~~ 如有错误或观点不一致的请评论留言共同讨论,本人前端小白一枚,根据自己实际项目遇到的问题进行总结分享,谢谢大家的阅读!

    2024年01月24日
    浏览(41)
  • Element中Upload组件上传(图片和文件的默认上传以及自定义上传)

    适用于:文件上传接口只要求file二进制文件,无需其他参数。(或者配置data属性用于上传时附带的额外参数)。 该实现方式会在选择完图片后就根据配置好的action的接口上传地址自动上传图片。 重点就是配置好 action属性 ,以及限制类型和大小。 不需要配置action,使用http-r

    2024年01月21日
    浏览(33)
  • MultipartFile实现文件上传功能

    MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。在文件上传这方面能帮助我们快速简洁实现。 1、yml配置文件 2、API介绍 3、文件上传示例 注意: @RequestPart(\\\"file\\\") 主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,

    2024年02月16日
    浏览(37)
  • 基于vue element-ui 封装上传图片组件 功能:上传,删除,预览,上传图片水印,拖拽排序,上传进度条等

    我们在开发后台时肯定避免不了上传图片的功能 例如: 上传图片回显 上传完成 : 预览查看 , 删除等 如果是图片列表,还可能让你拖动图片排序 有的后台项目可能要给图片添加水印,添加标记 有的后台可能要炫酷一点 添加进度条功能 现在我们要完成上面的一系列功能,这里我

    2024年02月16日
    浏览(44)
  • Vue中使用的el-upload时批量上传图片时报错问题处理

    项目场景:项目中有一个文件上传的场景,使用el-upload组件进行上传,单图上传是正常,但是在进行批量上传时报了错。 使用el-upload在进行多图批量上传时系统提示报错。 报错提示: Uncaught TypeError: Cannot set properties of null (setting \\\'status\\\')     at VueComponent.handleProgress (element-ui

    2024年02月06日
    浏览(31)
  • Vue +vue-quill-editor+ Element UI使用富文本编辑器,上传图片,上传视频

    如果你们有问题,可以发评论提问,我看见一定回复!!!!! 一、基本使用 1、下载vue-quill-editor组件 2、引入· 富文本组件 方式一:全局引入 (在 main.js 文件中) 方式二:按需引入 (在 单个组件 中引用) 3、工具栏相关配置 4、设置工具栏中文提示 5、修改vue-quill-editor字体

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包