概要
使用Feign调用服务的上传文件接口
服务接口
- 文件流和json参数
@PostMapping("/upload")
@ResponseBody
public Result uploadFile(HttpServletRequest request, UploadFileParam uploadFileParam) {
// 具体实现不展示了
}
- 只有文件流
@PostMapping(value = "/upload")
@ResponseBody
public Result uploadFile(@RequestParam("file") MultipartFile file) {
// 具体实现不展示了
}
FeignClient
- Feign上传文件并有json格式的参数
@RequestMapping(method = RequestMethod.POST, value = "/xxx/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result uploadFile(@RequestPart MultipartFile file, @RequestPart UploadFileParam uploadFileParam);
- Feign上传文件不带参数
@RequestMapping(method = RequestMethod.POST, value = "/xxx/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result uploadFile(@RequestPart MultipartFile file);
MultipartFile 的构造
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.io.IOUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
public static MultipartFile createMultipartFile(File file) {
if (file == null) {
return null;
}
String fileName = UUID.randomUUID().toString();
// 文件转为MultipartFile对象
DiskFileItemFactory factory = new DiskFileItemFactory();
FileItem fileItem = factory.createItem(fileName, CONTENT_TYPE_MULTIPART, false, fileName + SUFFIX_PNG);
OutputStream os;
try {
os = fileItem.getOutputStream();
} catch (IOException e) {
log.error("获取FileItem输出流异常!", e);
return null;
}
// 将文件写入输出流
try (FileInputStream is = new FileInputStream(file)) {
IOUtils.copy(is, os);
} catch (IOException e) {
log.error("写入FileItem异常!", e);
return null;
}
return new CommonsMultipartFile(fileItem);
}
调用Feign
fileFeignService.uploadFile(multipartFile)