Http文件上传

方式一:HttpClient

java 复制代码
public static String uploadFile(String url, Map<String, FileWrapper> fileParam, Map<String,String> otherParam){
   	long start = System.currentTimeMillis();
   	log.info("uploadFile url: {}.",url);
   	HttpClient client = HttpClients.createDefault();
   	HttpPost post = new HttpPost(url);
   	//设置参数
   	post.setProtocolVersion(HttpVersion.HTTP_1_1);
   	RequestConfig requestConfig = RequestConfig.custom()
   			.setConnectTimeout(CONN_TIMEOUT)
   			.setSocketTimeout(READ_TIMEOUT)
   			.build();
   	post.setConfig(requestConfig);

   	try {
   		ContentType contentType = ContentType.create("multipart/form-data", StandardCharsets.UTF_8);
   		MultipartEntityBuilder builder = MultipartEntityBuilder.create()
   				.setMode(HttpMultipartMode.RFC6532)
   				.setCharset(StandardCharsets.UTF_8)
   				.setContentType(contentType);

   		//添加文件参数
   		for (Map.Entry<String, FileWrapper> fileWrapperEntry : fileParam.entrySet()) {
   			String k = fileWrapperEntry.getKey();
   			FileWrapper v = fileWrapperEntry.getValue();
   			log.info("fileName: {}, fileMd5: {}",k, MD5Util.md5(FileUtils.readFileToByteArray(v.getFile())));
   			builder.addPart(k,new FileBody(v.getFile(),contentType, v.getFileName()));
   		}
   		//添加其他参数
   		if (MapUtils.isNotEmpty(otherParam)){
   			otherParam.forEach((k,v) -> builder.addTextBody(k,v,contentType));
   		}
   		// 设置请求实体
   		post.setEntity(builder.build());

   		HttpResponse response = client.execute(post);
   		return EntityUtils.toString(response.getEntity(),StandardCharsets.UTF_8);
   	} catch (Exception e) {
   		log.error("uploadFile fail. url: {}",url,e);
   		throw new RuntimeException("uploadFile exception ", e);
   	}finally {
   		log.info("uploadFile cost {}ms",System.currentTimeMillis()-start );
   	}
   }



public static class FileWrapper{
   	private File file;
   	private String fileName;
   	private String contentType;

   	public FileWrapper() {
   	}

   	public FileWrapper(File file, String fileName, String contentType) {
   		this.file = file;
   		this.fileName = fileName;
   		this.contentType = contentType;
   	}

   	public File getFile() {
   		return file;
   	}

   	public void setFile(File file) {
   		this.file = file;
   	}

   	public String getFileName() {
   		return fileName;
   	}

   	public void setFileName(String fileName) {
   		this.fileName = fileName;
   	}

   	public String getContentType() {
   		return contentType;
   	}

   	public void setContentType(String contentType) {
   		this.contentType = contentType;
   	}
   }

方式二:RestTemplate

java 复制代码
public String uploadFile(byte[] fileData, String fileName, LocalDateTime time) {

       //构建请求头
       HttpHeaders headers = new HttpHeaders();
       MediaType type = MediaType.parseMediaType("multipart/form-data");
       headers.setContentType(type);
       headers.setContentLength(fileData.length);
       headers.setContentDispositionFormData("media", fileName);
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHH");
       String format = time.format(formatter);
       String date = format.substring(0, 8);
       String hourPart = format.substring(8, 10);
       //构建请求体
       MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();

       ByteArrayResource fileAsResource = new ByteArrayResource(fileData){
           @Override
           public String getFilename() {
               return fileName;
           }

           @Override
           public long contentLength() {
               return fileData.length;
           }
       };
       //其他参数
       parts.add("file", fileAsResource);
       parts.add("fileName", fileName);
       parts.add("date", date);
       parts.add("hour", hourPart);
       parts.add("fileType", config.getFileType());
       parts.add("businessType", config.getBusinessType());

       HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(parts, headers);

       //发送post请求上传文件
       ResponseEntity<String> responseEntity = restTemplate.postForEntity(config.getUrl() + "/uploadFile", formEntity, String.class);

       JSONObject response= JSONObject.parseObject(responseEntity.getBody());

       if (response!= null && Integer.parseInt(response.get("code").toString()) == 0) {
           //得到存储地址
           return (String) response.get("path");
       } else {
           log.error("response is null and file name is {}", fileName);
           return "";
       }

   }
相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv78 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫8 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287928 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本8 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211238 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯10 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889610 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java