文件修改后保存(以图片为例子)

141 阅读1分钟

文件修改后保存(以图片为例子)

小伙伴们大叫好,今天带来的是文件修改后保存后端接口的代码!
话不多说;直接上你们想要的干货代码!

1. 首先是controller的代码

FileDate是前端传过来的,里面包含文件id和文件的base64两个数据

@PostMapping("/save")
public Result save(@RequestBody FileDate fileDate, HttpServletRequest request){
    String base64 = fileDate.getBase64();
    Integer id = fileDate.getId();
    MultipartFile file = fileService.Base64ToMultipartFile(base64);
    String originalFilename = file.getOriginalFilename();
    String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    String realPath = request.getServletContext().getRealPath("/");
    File folder = new File(realPath);
    if (!folder.exists()) {
        folder.mkdirs();
    }
    String newName = UUID.randomUUID() + suffix;
    try {
        //transferTo用于把图片上传到指定磁盘
        file.transferTo(new File(folder, newName));

        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/" + newName;
        FilePojo filePojo = new FilePojo();
        filePojo.setUrl(url);
        filePojo.setId(id);
        Result update = fileService.update(filePojo);
        if(1000 == update.getCode()){
            return result.Success(filePojo);
        }else {
            return update;
        }
    } catch (IOException e) {
        return result.Fail(e.getMessage());
    }
}

2. 接下来是serviceImpl的代码


    @Override
    public MultipartFile Base64ToMultipartFile(String base64) {
        final String[] base64Array = base64.split(",");

        // base64转为流
        String dataUir = base64Array[0];
        String data = base64Array[1];
        MultipartFile multipartFile = new Base64ToMultipartFile(data, dataUir);
        return multipartFile;
    }

3. 接下来是Base64ToMultipartFile工具类的代码

package com.example.photovue.util;

import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @Title:
 * @Description:
 * @Author: WKN
 * CreateDate: 2022/9/22 16:08
 */
public class Base64ToMultipartFile implements MultipartFile{
    private final byte[] fileContent;

    private final String extension;
    private final String contentType;


    /**
     * @param base64
     * @param dataUri     格式类似于: data:image/png;base64
     */
    public Base64ToMultipartFile(String base64, String dataUri) {
        this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
        this.extension = dataUri.split(";")[0].split("/")[1];
        this.contentType = dataUri.split(";")[0].split(":")[1];
    }

    public Base64ToMultipartFile(String base64, String extension, String contentType) {
        this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
        this.extension = extension;
        this.contentType = contentType;
    }

    @Override
    public String getName() {
        return "param_" + System.currentTimeMillis();
    }

    @Override
    public String getOriginalFilename() {
        return "file_" + System.currentTimeMillis() + "." + extension;
    }

    @Override
    public String getContentType() {
        return contentType;
    }

    @Override
    public boolean isEmpty() {
        return fileContent == null || fileContent.length == 0;
    }

    @Override
    public long getSize() {
        return fileContent.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
        return fileContent;
    }

    @Override
    public ByteArrayInputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(fileContent);
    }

    @Override
    public void transferTo(File file) throws IOException, IllegalStateException {
        try (FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(fileContent);
        }
    }

}

该接口的mapper和xml太简单就不列出来了,代码还可以优化,可以自己优化哟!

完结!