SpringBoot项目中前后端对图片的上传与接收操作

一、问题介绍

在一个在线图片分享系统中,前端使用JS+jQuery,后端使用Maven管理项目,采用分层次目录结构(Controller、Service、Mapper等)的一个Java语言编写的SSM(Spring+SpringBoot+Mybatis)项目中,需要实现一个前端标签上传图片,后端Controller层接收并处理图片。

二、前端上传图片方案

1.上传

上传图片的方式有很多,可以采用base64、blob等类型处理,而本文由于前端上传图片采用的是原生JS标签input的file类型:

<input type="file">

这个标签选择文件后,图片的路径会显示在这个标签中,但直接使用这个标签显然是不可以获取到图片的(你只是访问本地路径可以看得见图片,但网页它不认识这个路径所意味着的图片文件)。

2.前端网页显示此上传的图片

(1)HTML代码:

<input type="file" id="uploadimage" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg">
<img id="showimage" style="width: auto;height: 80%;" src="" alt="请上传图片">

属性解释:
<input>标签:
id:ID属性值,用于JS定位该标签;
type:设置为file,提供一个可以上传文件的按钮;
accept:顾名思义,是限制接受的文件类型的,规定这个属性值可限定文件类型为图片,如.jpg、.png(高清)、.gif(动图)、.jpeg、.svg(不推荐);
<img>标签:
id:同上;
style:样式设定;
src:路径;
alt:加载图片失败或src为空时的默认文本。

(2)JS代码:

 document.getElementById("uploadimage").onchange = function(){//当input标签上传了一个图片时
     var file = this.files;//将当前图片文件赋值给file变量
     var reader = new FileReader();//创建一个新FileReader类
     reader.readAsDataURL(file[0]);//将图片文件传给该FileReder
     reader.onload = function ()//加载
     {
         var image = document.getElementById("showimage");
         image.src = reader.result;
     };
 }

3.前端上传该图片文件

使用JS代码处理该文件,采用FormData类型将该图片以二进制流的形式发给后端:
JS代码:
FormData类的使用:

var formData = new FormData();
formData.set("file", document.getElementById('uploadimage').files[0]);

使用$.ajax发送请求:

$.ajax({
    url: "images/insertOneImageFile",//后端Controller层处理图片文件的对应接口
    type: "post",
    data: formData,//发送的数据为FormData类
    async: false,
    cache: false,
    processData: false,   // 不处理发送的数据
    contentType: false,   // 不设置Content-Type请求头
    success:function (data) {
        $("#path").text(data);
        console.log(data);
    },
    error: function(error){
        imagestring = "";
        alert("上传图片出错!");
    }
});

4.后端处理FormData:

Controller层代码:

    @RequestMapping("/insertOneImageFile")
    public String insertOneImageFile(HttpServletRequest request, HttpServletRequest response, HttpSession session){
        MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
        MultipartFile multipartFile = multipartRequest.getFile("file");
        assert multipartFile != null;
        MultipartFileToFile.saveMultipartFile(multipartFile, "src/main/resources/static/images");
        return MultipartFileToFile.saveMultipartFile(multipartFile, "target/classes/static/images");
    }

所使用的保存图片到本地路径的工具类1:MultipartFileToFile.class:
(注:本文默认已经配置好Spring及SpringBoot环境)

package com.id.utils;

import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * @Description 存储和删除MultipartFile文件
 * @Author haoyalei
 **/
public class MultipartFileToFile {

    /**
     *
     * @param file
     * @param targetDirPath 存储MultipartFile文件的目标文件夹
     * @return 文件的存储的绝对路径
     */
    public static String saveMultipartFile(MultipartFile file, String targetDirPath){

        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            return null;
        } else {

            /*获取文件原名称*/
            String originalFilename = file.getOriginalFilename();
            /*获取文件格式*/
            String fileFormat = originalFilename.substring(originalFilename.lastIndexOf("."));

            String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
            toFile = new File(targetDirPath + File.separator + uuid + fileFormat);

            String absolutePath = null;
            try {
                absolutePath = toFile.getCanonicalPath();

                /*判断路径中的文件夹是否存在,如果不存在,先创建文件夹*/
                String dirPath = absolutePath.substring(0, absolutePath.lastIndexOf(File.separator));
                File dir = new File(dirPath);
                if (!dir.exists()) {
                    dir.mkdirs();
                }

                InputStream ins = file.getInputStream();

                inputStreamToFile(ins, toFile);
                ins.close();

            } catch (IOException e) {
                e.printStackTrace();
            }



            return uuid + fileFormat;//uuid为保存时所使用的文件名;fileFormat为文件扩展名(.jsp什么的)
        }

    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除本地临时文件
     *
     * @param file
     */
    public static void deleteTempFile(File file) {
        if (file != null) {
            File del = new File(file.toURI());
            del.delete();
        }
    }
}

附言

由于本选题程序不便于公开,故此处只贴上核心代码。


  1. 参照链接:https://blog.csdn.net/weixin_45379185/article/details/125852990 ↩︎

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot前后端分离的项目,实现文件上传接口可以这样做: 1. 在后端(服务器端)创建一个处理文件上传的Controller类,该类使用`@RestController`注解标识为一个RESTful接口。在该Controller,使用`@PostMapping`注解标识一个处理POST请求的方法,该方法用于处理文件上传操作。 2. 在该处理方法的参数列表,使用`@RequestParam`注解指定接收文件数据的变量名,并定义为`MultipartFile`类型。这样就可以接收前端发送的文件数据了。 3. 在方法体,可以对接收到的文件数据进行处理。比如,可以通过`MultipartFile`对象的`getOriginalFilename()`方法获取文件的原始文件名,再通过其`getInputStream()`方法获取文件的字节流数据。 4. 可以根据业务需求对文件进行一些处理操作。比如,将文件保存到服务器的某个目录下,可以使用`File`对象的相关方法,如`createNewFile()`方法创建文件、`getAbsolutePath()`方法获取文件的绝对路径等。 5. 上述处理完成后,可以返回一些处理结果给前端,比如文件的保存路径、上传成功与否的标识等信息。 需要注意的是,在前端进行文件上传时,需要使用`FormData`对象来封装文件数据和其他表单数据,再通过`XMLHttpRequest`对象或其他方式发送到后端处理。 此外,还应该考虑文件上传的安全性和性能方面的优化,比如限制文件大小、文件类型校验、文件存储路径的管理等细节问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值