先上代码:

    public void uploadToUrl(String fileId, String fileSetId, String formUrl) throws Throwable {
String urlStr = MyServiceConfig.getUrl() + UPLOAD_URL;
String fileName = FileUtils.getFileName(formUrl);
long fileSize = getFileSize(formUrl);
String uri = UriComponentsBuilder.fromUriString(urlStr).queryParam("fileId", fileId).build().encode().toString(); logger.debug("文件上传请求路径:{}", uri); // 获取文件输入流
InputStream in = getFileInputString(formUrl);
if (null != in) {
URL urlObj = new URL(uri);
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
con.setRequestMethod("POST"); // 设置关键值,以Post方式提交表单,默认get方式
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false); // post方式不能使用缓存
// 设置请求头信息
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
// 设置边界
String BOUNDARY = "----------" + System.currentTimeMillis();
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
// 请求正文信息
// 第一部分:
StringBuilder sb = new StringBuilder();
sb.append("--"); // 必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + fileName + "\"\r\n");
if(!fileName.endsWith("mp4")){
sb.append("Content-Type:image/jpeg\r\n\r\n");
}else if(){
sb.append("Content-Type:video/mp4\r\n\r\n");
}
//未知文件类型,以流的方式上传
//sb.append("Content-Type:application/octet-stream\r\n\r\n");
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
OutputStream out = new DataOutputStream(con.getOutputStream());
// 输出表头
out.write(head);
// 文件正文部分
// 把文件已流文件的方式 推入到url中
DataInputStream dataIn = new DataInputStream(in);
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = dataIn.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
// 结尾部分
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
out.write(foot);
out.flush();
out.close(); // 读取返回数据
StringBuffer strBuf = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
strBuf.append(line).append("\n");
}
logger.debug("文件上传返回信息{}",strBuf.toString());
reader.close();
con.disconnect();
con = null;
} else {
throw new Throwable("获取文件流失败,文件下载地址url=" + formUrl);
} } // 获取文件大小
public InputStream getFileInputString(String formUrl) throws Throwable {
URL urlPath = new URL(formUrl);
HttpURLConnection conn = (HttpURLConnection) urlPath.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int status = conn.getResponseCode();
if (status == 200) {
return conn.getInputStream();
}
return null;
} //获取文件大小
public long getFileSize(String formUrl) throws Throwable{
URL urlPath = new URL(formUrl);
HttpURLConnection conn = (HttpURLConnection)urlPath.openConnection();
conn.setConnectTimeout(downloadTimeout);
conn.setRequestMethod("GET");
int status = conn.getResponseCode();
if(status==200){
return conn.getContentLengthLong();
}
return 0;
}

    

public static String getFileName(String fileFullPath) {
fileFullPath = fileFullPath.replace("/", "\\");
return fileFullPath.substring(fileFullPath.lastIndexOf("\\") + 1,
fileFullPath.length());
}

public static String getFileNameWithoutSuffix(String fileFullPath) {
fileFullPath = fileFullPath.replace("/", "\\");
return fileFullPath.substring(fileFullPath.lastIndexOf("\\") + 1,
fileFullPath.lastIndexOf("."));
}

 

代码逻辑:

1、从访问文件的url中获取文件流和文件大小;

2、模拟http上传文件post请求;

1》.打开httpurlconnection连接,设置关键值:重点是设置请求方法post和设置不缓存;

2》.设置请求头,设置边界;重点是Content-Type;

3》.设置请求正文,比较复杂,参照代码;

4》.获取返回值;

二、使用httpClient4.4上传文件:

//上传实体文件
public static void upload(String url,String filePath) throws Exception{
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
+ "Chrome/62.0.3202.89 Safari/537.36");
httpPost.setHeader("Accept-Language","zh-cn,zh;q=0.5");
httpPost.setHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.7");
httpPost.setHeader("Connection","keep-alive"); MultipartEntityBuilder mutiEntity = MultipartEntityBuilder.create();
File file = new File(filePath);
//File file = new File("C:\\Users\\\\Desktop\\20171002中士.mp4");
//mutiEntity.addTextBody("filename","1问题.mp4");
mutiEntity.addPart("file", new FileBody(file)); CloseableHttpClient httpClient = HttpClients.createDefault();
httpPost.setEntity(mutiEntity.build());
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
String content = EntityUtils.toString(httpEntity);
System.out.println(content); }

上传文件流: 重点是mode的设置,这里卡了半天;

    //上传文件流
public static void upload(String url,InputStream in) throws Exception{
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
+ "Chrome/62.0.3202.89 Safari/537.36");
httpPost.setHeader("Accept-Language","zh-cn,zh;q=0.5");
httpPost.setHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.7");
httpPost.setHeader("Connection","keep-alive"); MultipartEntityBuilder mutiEntity = MultipartEntityBuilder.create();
//mutiEntity.addTextBody("filename","16有问题.mp4");
mutiEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
mutiEntity.addBinaryBody("uploadFile", in, ContentType.create("multipart/form-data"), "16有问题.mp4");  CloseableHttpClient httpClient = HttpClients.createDefault();
httpPost.setEntity(mutiEntity.build());
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
String content = EntityUtils.toString(httpEntity);
System.out.println(content); }

使用RestTemplate:

public static void uploadFile(String url,File file){
RestTemplate template = new RestTemplate();
ClientHttpRequestFactory clientFactory = new HttpComponentsClientHttpRequestFactory();
template.setRequestFactory(clientFactory); URI uri = UriComponentsBuilder.fromUriString(url).build().encode().toUri(); FileSystemResource resource = new FileSystemResource(file);
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", resource);
//param.add("fileName", "问题.mp4");
org.springframework.http.HttpEntity<MultiValueMap<String, Object>> httpEntity = new org.springframework.http.HttpEntity<MultiValueMap<String, Object>>(param);
ResponseEntity<String> responseEntity = template.exchange(uri, HttpMethod.POST, httpEntity, String.class);
System.out.println("文件上传成功,返回:" + responseEntity.getBody());
}

RestTemplate上传文件流:不建议用

这个比较麻烦,先看代码吧;

    public static void uploadFile(String url,InputStream in){
RestTemplate template = new RestTemplate();
ClientHttpRequestFactory clientFactory = new HttpComponentsClientHttpRequestFactory();
template.setRequestFactory(clientFactory); URI uri = UriComponentsBuilder.fromUriString(url).build().encode().toUri(); // InputStreamResource resource = new InputStreamResource(in); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", new MultipartFileResource(in, "test"));
//param.add("fileName", "问题.mp4");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA); org.springframework.http.HttpEntity<MultiValueMap<String, Object>> httpEntity =
new org.springframework.http.HttpEntity<MultiValueMap<String, Object>>(param,headers); List<HttpMessageConverter<?>> messageConverters = template.getMessageConverters();
for (int i = 0; i < messageConverters.size(); i++) {
HttpMessageConverter<?> messageConverter = messageConverters.get(i);
if ( messageConverter.getClass().equals(ResourceHttpMessageConverter.class) )
messageConverters.set(i, new ResourceHttpMessageConverterHandlingInputStreams());
} ResponseEntity<String> responseEntity = template.exchange(uri, HttpMethod.POST, httpEntity, String.class); System.out.println("文件上传成功,返回:" + responseEntity.getBody());
}

这是修改后的,添加了转换器,因为添加之前会报错,文件流读了两次,其中一次是读取文件大小contentLength;

package com.my.upload;

import java.io.IOException;
import java.io.InputStream; import org.springframework.core.io.InputStreamResource; public class MultipartFileResource extends InputStreamResource { private final String filename; public MultipartFileResource(InputStream inputStream, String filename) {
super(inputStream);
this.filename = filename;
}
@Override
public String getFilename() {
return this.filename;
} @Override
public long contentLength() throws IOException {
return -1; // we do not want to generally read the whole stream into memory ...
}
} package com.my.upload; import java.io.IOException; import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.converter.ResourceHttpMessageConverter; public class ResourceHttpMessageConverterHandlingInputStreams extends ResourceHttpMessageConverter { @Override
protected Long getContentLength(Resource resource, MediaType contentType) throws IOException {
Long contentLength = super.getContentLength(resource, contentType); return contentLength == null || contentLength < 0 ? null : contentLength;
}
}

以上!

Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)的更多相关文章

  1. java模拟浏览器上传文件

    public static void main(String[] args) { String str = uploadFile("C:/Users/RGKY/Desktop/wKgBHVb ...

  2. ApiPost接口调试工具模拟Post上传文件(中文版Postman)

    ApiPost简介: ApiPost是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工具 . A ...

  3. c# 模拟POST上传文件到服务器

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  4. 《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  5. 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)

    1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...

  6. java模拟form上传数据

    Java模拟form表单上传 查看form表单提交的http请求为 import java.io.*; import java.net.*; public class FileUpload { /** ...

  7. java使用httpcomponents 上传文件

    一.httpcomponents简介 httpcomponents 是apache下的用来负责创建和维护一个工具集的低水平Java组件集中在HTTP和相关协议的工程.我们可以用它在代码中直接发送htt ...

  8. Java Servlet 接收上传文件

    在Java中使用 Servlet 来接收用户上传的文件,需要用到两个apache包,分别是 commons-fileupload 和 commons-io 包: 如果直接在doPost中,使用requ ...

  9. 通过WebClient模拟post上传文件到服务器

    写在前面 最近一直在研究sharepoint的文档库,在上传文件到文档库的过程中,需要模拟post请求,也查找了几种模拟方式,webclient算是比较简单的方式. 一个例子 这里写一个简单接受pos ...

随机推荐

  1. iOS iOS10 的适配问题

    其他:Xcode8 iOS10 的新特性 1.系统判断方法失效:2.隐私数据的访问问题:3.UIColor 问题4.真彩色的显示5.ATS问题6.UIStatusBar问题7.UITextField8 ...

  2. Hive实际应用小结

    1.简介 Hive是数据仓库平台,构建在Hadoop之上用来处理结构化数据.Hive是一个SQL解析引擎,能够将SQL语句转化成MapReduce作业并在Hadoop上执行,从而使得查询和分析更加方便 ...

  3. qml demo分析(externaldraganddrop-拖拽)

    一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...

  4. Angular 报错 Can't bind to 'formGroup' since it isn't a known property of 'form'

    错误描述 当form表单加FormGroup属性时报错 Can't bind to 'formGroup' since it isn't a known property of 'form' < ...

  5. PHP判断手机号运营商(详细介绍附代码)

    道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ...

  6. Node.js平台的一些使用总结

    Node.js的安装 菜鸟教程 npm -v查看npm的版本. npm更新 npm官网 npm权限问题 由于npm经常会因为权限问题,不能全局安装模块,所以解决办法如下: npm官网 npm切换淘宝源 ...

  7. Angularjs 2 绝对零基础的教程(1):从安装配置开始

    写在前面 适合人群: 1. 愿意未来从事前端工作,并以此开拓自己未来职业 2. 有任何一种编程语言基础 3. 喜欢简单粗暴学一门实用的技术,而不是做科研. Angular 2 比 Angular 1 ...

  8. scrapy框架第一章

    操作环境:python2.7+scrapy 安装比较简单,网上教程也超多,就不在此赘述. 示例网站:https://www.cnblogs.com/cate/python/ (爬去关于博客园所有pyt ...

  9. BeanShell断言(一)

    在beanShell中直接可以调用的变量,无需加前缀. 1.log 打印日志 log.info(“在控制台打印日志”); 2.SampleResult 获取SampleResult对象,可以通过这个对 ...

  10. python爬取大众点评

    拖了好久的代码 1.首先进入页面确定自己要抓取的数据(我们要抓取的是左侧分类栏-----包括美食.火锅)先爬取第一级分类(美食.婚纱摄影.电影),之后根据第一级链接爬取第二层(火锅).要注意第二级的p ...