记一次base64转MultipartFile的坑

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

现在有个需求是接收base64编码的图片,然后上传到文件服务器上,由于文件服务的代码是固定的代码不能修改,所以只能适配接口。文件服务代码如下:
  1. @FeignClient(value = "base-files", configuration = SpringMultipartEncoder.class)
  2. public interface UploadsClient {
  3.     @PostMapping(value = "base/file/uploads",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  4.     Map<String, Object> uploads(@RequestPart(value = "files") MultipartFile[] files);
  5. }
复制代码
所以需要把base64转成对应的MultipartFile,于是在网上找到了转换的代码
  1. import org.springframework.web.multipart.MultipartFile;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.Base64;
  8. /**
  9. * @author Administrator
  10. */
  11. public class Base64ToMultipartFile implements MultipartFile {
  12.     private final byte[] fileContent;
  13.     private final String extension;
  14.     private final String contentType;
  15.     /**
  16.      * @param base64
  17.      * @param dataUri 格式类似于: data:image/png;base64
  18.      */
  19.     public Base64ToMultipartFile(String base64, String dataUri) {
  20.         this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
  21.         this.extension = dataUri.split(";")[0].split("/")[1];
  22.         this.contentType = dataUri.split(";")[0].split(":")[1];
  23.     }
  24.     public Base64ToMultipartFile(String base64, String extension, String contentType) {
  25.         this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8));
  26.         this.extension = extension;
  27.         this.contentType = contentType;
  28.     }
  29.     @Override
  30.     public String getName() {
  31.         return "<strong>files</strong>";
  32.     }
  33.     @Override
  34.     public String getOriginalFilename() {
  35.         return "file_" + System.currentTimeMillis() + "." + extension;
  36.     }
  37.     @Override
  38.     public String getContentType() {
  39.         return contentType;
  40.     }
  41.     @Override
  42.     public boolean isEmpty() {
  43.         return fileContent == null || fileContent.length == 0;
  44.     }
  45.     @Override
  46.     public long getSize() {
  47.         return fileContent.length;
  48.     }
  49.     @Override
  50.     public byte[] getBytes() throws IOException {
  51.         return fileContent;
  52.     }
  53.     @Override
  54.     public ByteArrayInputStream getInputStream() throws IOException {
  55.         return new ByteArrayInputStream(fileContent);
  56.     }
  57.     @Override
  58.     public void transferTo(File file) throws IOException, IllegalStateException {
  59.         try (FileOutputStream fos = new FileOutputStream(file)) {
  60.             fos.write(fileContent);
  61.         }
  62.     }
  63. }
复制代码
调试了以后接口可以调通但是文件服务却接收不到文件,经过长时间的排查发现重写的Base64ToMultipartFile类的getName()方法必须返回和接收参数同名的值,即files,否则feign的接收方无法收到对应的参数。
  1. Base64ToMultipartFile
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表