private String getKzFileUrl(String imgUrl) {
String kzFileUrl = "";
InputStream ips = null;
ByteArrayOutputStream bos = null;
try {
URL url = new URL(imgUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
//从HTTP响应消息获取状态码
int code = conn.getResponseCode();
String fileName = imgUrl.substring(imgUrl.lastIndexOf("/")+1);
//如果状态码为200表示请求成功
if(code == 200){
//获取输入流
ips = conn.getInputStream();
MultipartFile multipartFile = new MockMultipartFile(fileName,fileName, MediaType.MULTIPART_FORM_DATA_VALUE, ips);
MultipartFile[] files = new MultipartFile[1];
files[0] = multipartFile;
LocalDateTime now = LocalDateTime.now();
DataResult<List<String>> urls = workOrderClient.uploadFiles(files,now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),true);
List<String> utlList = urls.getData();
if (CollectionUtil.isNotEmpty(utlList)){
kzFileUrl = utlList.get(0);
}
}
} catch (ProtocolException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return kzFileUrl;
}
//feign接口
@FeignClient(value = "customer-service-api", path = "/abc", fallbackFactory = WorkOrderClientFallbackFactory.class,configuration = { MultipartSupportConfig.class})
public interface WorkOrderClient {
@PostMapping(value = "/uploadFiles")
DataResult<List<String>> uploadFiles(@RequestPart(value = "files") MultipartFile[] files, @RequestParam(required = false) String createDate, @RequestParam(required = false) Boolean returnFullPath);
}
//配置文件1
@Component
public class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new FeignSpringFormEncoder(new SpringEncoder(messageConverters));
}
}
//配置文件2
public class FeignSpringFormEncoder extends FormEncoder {
public FeignSpringFormEncoder() {
this(new Default());
}
public FeignSpringFormEncoder(Encoder delegate) {
super(delegate);
MultipartFormContentProcessor processor = (MultipartFormContentProcessor) this.getContentProcessor(ContentType.MULTIPART);
processor.addWriter(new SpringSingleMultipartFileWriter());
processor.addWriter(new SpringManyMultipartFilesWriter());
}
/**
* 重写encode方法,自定义添加boundary属性
* @param object
* @param bodyType
* @param template
* @throws EncodeException
*/
@Override
public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
if (bodyType.equals(MultipartFile.class)) {
setHeader(template);
MultipartFile file = (MultipartFile) object;
Map<String, Object> data = Collections.singletonMap(file.getName(), object);
super.encode(data, MAP_STRING_WILDCARD, template);
return;
} else if (bodyType.equals(MultipartFile[].class)) {
setHeader(template);
MultipartFile[] file = (MultipartFile[]) object;
if (file != null) {
Map<String, Object> data = Collections.singletonMap("files", object);
super.encode(data, MAP_STRING_WILDCARD, template);
return;
}
}
super.encode(object, bodyType, template);
}
private void setHeader(RequestTemplate template) {
List<String> type = new ArrayList<>();
type.add("multipart/form-data;boundary=" + UUID.randomUUID().toString().replace("-", ""));
Map<String, Collection<String>> typeMap = new HashMap<>();
typeMap.put(HttpHeaders.CONTENT_TYPE, type);
template.headers(typeMap);
}
}
//引用的包
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.0.3</version>
</dependency>
<!--file upload-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
//附加另一种先保存到本地的方法
private String getKzFileUrl(String imgUrl) {
String kzFileUrl = "";
InputStream ips = null;
ByteArrayOutputStream bos = null;
try {
URL url = new URL(imgUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
//从HTTP响应消息获取状态码
int code = conn.getResponseCode();
String fileName = imgUrl.substring(imgUrl.lastIndexOf("/")+1);
//如果状态码为200表示请求成功
if(code == 200){
//获取输入流
ips = conn.getInputStream();
byte[] buffer = new byte[4*1024];
int len = 0;
bos = new ByteArrayOutputStream();
while ((len = ips.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
ips.close();
String fileUrl = this.uploadFileByBytes(bos.toByteArray(),fileName);
File file = new File(fileUrl);
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem(file.getName(), ContentType.MULTIPART_FORM_DATA.toString(),false,file.getName());
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
len = 0;
buffer = new byte[4*1024];
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
fis.close();
MultipartFile multipartFile = new CommonsMultipartFile(item);
MultipartFile[] files = new MultipartFile[1];
files[0] = multipartFile;
LocalDateTime now = LocalDateTime.now();
DataResult<List<String>> urls = workOrderClient.uploadFiles(files,now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),true);
List<String> utlList = urls.getData();
if (CollectionUtil.isNotEmpty(utlList)){
kzFileUrl = utlList.get(0);
}
}
} catch (ProtocolException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return kzFileUrl;
}
private String uploadFileByBytes(byte[] bytes, String fileName) throws Exception {
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] < 0) {
bytes[i] += 256;
}
}
String realPath = System.getProperty("user.dir") + File.separator + "upload" + File.separator;
//文件路径
String url = realPath + fileName;
//判断文件路径是否存在,如果没有则新建文件夹
File files = new File(realPath);
if(!files.exists()){
files.mkdirs();
}
//把文件写入到指定路径下
try(OutputStream out = new BufferedOutputStream(new FileOutputStream(url, false))){
out.write(bytes);
}
return url;
}