Spring Boot笔记之上传图片(Base64和MultipartFile)

图片的上传

form表单上传

<form action="/user/upload/file" method="post" enctype="multipart/form-data">
    <input type="file" name="img" />
    <input type="submit" />
</form>

jquery.form.js提供的ajax上传

function updateFile() {
    $('#file').ajaxSubmit({
      url: url,
      type: 'POST',
      //contentType: false,
      xhrFields: {
        withCredentials: true
      },
      crossDomain: true,
      success: function (result) {
      },
      error: function (result) {
      }
    });
  }

Base64格式上传

有些APP插件会这么干,这里就不写了。

SpringMVC接收

MultipartFile接收

SpringMVC提供的org.springframework.web.multipart.MultipartFile很强大,接收file只需要@RequestParam(value = "img") MultipartFile file就可以了,MultipartFile还提供的几个很好用的API:

  • 获取文件类型getContentType()
  • 获取文件大小getSize()
  • 保存文件transferTo(java.io.File file)

接收、校验和保存:

@Controller
@RequestMapping("/user")
public class UserController extends BaseController {
    private static Logger logger = LoggerFactory.getLogger(UserController.class);
    @Value(value = "${image.path:./img}")
    private String imagePath;

    @Value(value = "${image.host:http://localhost}")
    private String imageHost;

    @RequestMapping(value = "/upload/file", method = RequestMethod.POST)
    @ResponseBody
    public Result<String> saveFile(@RequestParam(value = "img") MultipartFile file) {
        StringBuffer fileName = new StringBuffer();
        fileName.append(UUID.randomUUID().toString().replaceAll("-", ""));
        String type = file.getContentType();
        if ("image/png".equals(type)) {
            fileName.append(".png");
        } else if ("image/jpeg".equals(type)) {
            fileName.append(".jpeg");
        } else if ("image/gif".equals(type)) {
            fileName.append(".gif");
        } else {
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("请选择.png.jpg格式的图片")
                    .build();
        }
        if (file.getSize() > 1024000L) {
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("图片超过1Mb")
                    .build();
        }
        try {
            file.transferTo(new File(imagePath, fileName.toString()));
            return new Result.Builder<String>()
                    .code(0)
                    .msg("成功")
                    .data(imageHost + fileName.toString())
                    .build();
        } catch (IOException e) {
            e.printStackTrace();
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("保存失败")
                    .build();
        }
    }
}

Base64字符串接收

    @RequestMapping(value = "/upload/base64", method = RequestMethod.POST)
    @ResponseBody
    public Result<String> saveBase64(@RequestParam(value = "img") String base64Str) {
        StringBuffer fileName = new StringBuffer();
        fileName.append(UUID.randomUUID().toString().replaceAll("-", ""));
        if (StringUtils.isBlank(base64Str)) {
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("file不可缺省")
                    .build();
        } else if (base64Str.indexOf("data:image/png;") != -1) {
            base64Str = base64Str.replace("data:image/png;base64,", "");
            fileName.append(".png");
        } else if (base64Str.indexOf("data:image/jpeg;") != -1) {
            base64Str = base64Str.replace("data:image/jpeg;base64,", "");
            fileName.append(".jpeg");
        } else {
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("请选择.png.jpg格式的图片")
                    .build();
        }
        File file = new File(imagePath, fileName.toString());
        byte[] fileBytes = Base64.getDecoder().decode(base64Str);
        try {
            FileUtils.writeByteArrayToFile(file, fileBytes);
        } catch (IOException e) {
            e.printStackTrace();
            return new Result.Builder<String>()
                    .code(-1)
                    .msg("保存失败")
                    .build();
        }
        return new Result.Builder<String>()
                .code(0)
                .msg("成功")
                .data(imageHost + fileName.toString())
                .build();
    }

为了避免文件重名、Linux文件系统与Windows文件系统差异等因素会引起的异常,我通常使用UUID重命名后再保存。

nginx配置

上面代码中的image.path是文件的保存路径, image.host是提供给前端的访问方式,具体配置要结合nginx代理的配置:

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /data/www;
	……
}

这是一个本地测试环境的配置,仅供参考。image.path配置为/data/www/img/image.host配置为http://localhost/img/,这样,图片文件会存储在/data/www/img/,http访问img/test.jpeg时,nginx就会响应这张图片。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
base64转换为MultipartFile类型的方法是先将base64字符串分割成数据URI和数据部分。然后使用数据URI和数据部分创建一个MultipartFile对象。具体步骤如下: 1. 使用逗号分割base64字符串,得到一个字符串数组,其中索引0是数据URI,索引1是数据部分。 2. 根据数据URI和数据部分创建一个Base64ToMultipartFile对象,这个对象继承自MultipartFile接口。 3. 使用创建的Base64ToMultipartFile对象进行文件操作。 举个例子,假设有一个名为base64base64字符串。首先,我们需要将base64字符串分割成数据URI和数据部分。然后,使用数据URI和数据部分创建一个Base64ToMultipartFile对象。最后,使用创建的对象进行文件操作。以下是具体的代码示例: ``` final String[] base64Array = base64.split(","); String dataUri = base64Array<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [base64MultipartFile避坑](https://blog.csdn.net/kirk15951859811/article/details/128251514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Base64MultipartFile](https://blog.csdn.net/weixin_46099269/article/details/119354309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值