HttpClient构造文件上传
在项目中我们有时候需要使用到其他第三方的api,而有些api要求我们上传文件,search一下,下面将结果记录一下喽!
含义 ENCTYPE="multipart/form-data" 说明:
通过 http 协议上传文件 rfc1867协议概述,jsp 应用举例,客户端发送内容构造
1、概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。
2、上传文件实例,jsp例子:
<form action="gerry/publish/file" enctype="multipart/form-data" method="post">
file:<input type="file" name="file"/><br/>
<input type="submit" value="submit"/>
</form>
如果上传文件,我们必须将enctype设置成"multipart/form-data",表示我们上传的是一个二进制数据流。
3、Servlet中解析这个请求
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (isMultipart) {
// 构造一个文件上传处理对象
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory); Iterator items;
try {
// 解析表单中提交的所有文件内容
items = upload.parseRequest(req).iterator();
while (items.hasNext()) {
FileItem item = (FileItem) items.next();
System.out.println(item.getFieldName());
System.out.println(item.isFormField());
System.out.println(item.getString()); if (!item.isFormField()) {
// 取出上传文件的文件名称
String name = item.getName();
// 取得上传文件以后的存储路径
String fileName = name.substring(name.lastIndexOf('\\') + 1, name.length());
// 上传文件以后的存储路径
String path = req.getRealPath("file") + File.separatorChar + fileName; // 上传文件
File uploaderFile = new File(path);
item.write(uploaderFile);
}
}
} catch (Exception e) {
resp.getOutputStream().write(("throw exception " + e.getMessage()).getBytes());
}
} else {
resp.getOutputStream().write("is not this file upload".getBytes());
}
通过ServletFileUpload的parseRequest方法可以将文件流和非文件流全部解析出来。不用考虑HttpServletRequest中的数据流格式。
4、Spring中解析这个请求
在Spring中我们可以直接通过MultipartFile来获取请求中的文件流信息。
@RequestMapping(value = "/gerry/publish/file")
@ResponseBody
public String upload1(MultipartFile file) {
String originalFileName = file.getOriginalFilename();
String fileName = file.getName();
System.out.println(originalFileName);
System.out.println(fileName);
System.out.println(file.getContentType());
try {
MyHttpClient.addPic(file.getBytes());
} catch (Exception e) {
return "failure, the exception msg is: " + e.getMessage();
}
return "success";
}
5、代码中构造HttpClient请求,传输文件
/**
* 传输文件流bs
*
* @param bs
* 要传输的文件流
*/
public static void addPic(byte[] bs) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
MultipartEntity entity = new MultipartEntity();
entity.addPart("pic", new ByteArrayBody(bs, "pic"));
try {
// 添加其他的参数,可以是多个/零个
entity.addPart("name", new StringBody("liuming92"));
} catch (UnsupportedEncodingException e1) {
throw new RuntimeException(e1);
}
httpPost.setEntity(entity);
try {
HttpResponse httpResponse = httpClient.execute(httpPost);
if (httpResponse != null) {
String result = EntityUtils.toString(httpResponse.getEntity());
System.out.println(result);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
到这里位置,java中上传文件以及向第三方传输文件都实现啦。
HttpClient构造文件上传的更多相关文章
- HttpClient多文件上传代码及普通参数中文乱码问题解决
该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...
- 使用 HttpClient 进行文件上传
1.使用 AddPart 方法 public static void upload(String authorization,String baseUrl,String filePath,String ...
- Android使用HttpClient实现文件上传到PHP服务器,并监控进度条
上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($ ...
- HTTP POST请求报文格式分析与Java实现文件上传
时间 2014-12-11 12:41:43 CSDN博客 原文 http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...
- WebLogic任意文件上传漏洞(CVE-2019-2618)
WebLogic任意文件上传漏洞(CVE-2019-2618) 0x01 漏洞描述 漏洞介绍 CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口, ...
- CVE-2019-2618任意文件上传漏洞复现
CVE-2019-2618任意文件上传漏洞复现 漏洞介绍: 近期在内网扫描出不少CVE-2019-2618漏洞,需要复测,自己先搭个环境测试,复现下利用过程,该漏洞主要是利用了WebLogic组件中的 ...
- CVE-2019-2618 任意文件上传
漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Ma ...
- HttpClient 4.3.* 上传带中文文件名文件文件名乱码问题的解决
又是折腾了一天才解决的问题,网上关于这个问题的资料不多,希望写出来能帮到有需要的人. 之前无论怎么设置charset都不起作用, 后来看了这篇文章 才发现MultipartEntityBuilder有 ...
- HttpClient文件上传下载
1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...
随机推荐
- iReport折线图
1.拖动组件面板chart到Summary 2.右击-->chart data 单出 3. 4.X轴和Y轴必须是数字 series:系列 连续,串联 category:类型.部门. ...
- Eclipse上Spring-tool的安装
三种安装方式: 插件地址:http://spring.io/tools/sts/all 1.在线安装 Help-->> Install new Software 2.本地安装,Help- ...
- 无锁同步-C++11之Atomic和CAS
1.概要 本文是无锁同步系列文章的第一篇,主要探讨C++11中的Atomic. 我们知道在C++11中引入了mutex和方便优雅的lock_guard.但是有时候我们想要的是性能更高的无锁实现,下面我 ...
- Yii实现Password Repeat Validate Rule
在使用Yii时遇到这样的需求:在一个注册的页面输入两次密码,并验证两次输入是否一致.可是password的repeat的字段在数据库 并不存在.问题来了,如何创建一个password_repeat的属 ...
- css--position和float
1.元素设置position:relative或者position:absolute后,才能激活left,top,right,bottom和z-index属性,默认情况下这些属性并未激活,设置了也会无 ...
- 安装MYSql Windows7下MySQL5.5.20免安装版的配置
MySQL Windows安装包说明: 1.mysql-5.5.20-win32.msi:Windows 安装包,图形化的下一步下一步的安装. 2.mysql-5.5.20.zip,这个是window ...
- AnsiIO
1.文件数据内容,元数据内容 i节点ls -l err.txt-rw-rw-r-- 1 csgec csgec 50 Jun 23 11:19 err.txt-:普通文件(文件类型)rw-:属主用户拥 ...
- --@angularJS--一个简单的UI-Router路由demo
1.index.html: <!DOCTYPE HTML><html ng-app="routerApp"><head> <titl ...
- EF Code First:实体映射
二.实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5 ...
- MapReduce深度分析(一)
MapReduce深度分析(一) 一.数据流向分析 图为MapReduce数据流向示意图 步骤1.输入文件从HDFS流向到Mapper节点.在一般情况下,存储数据的节点就是Mapper运行的节点,不需 ...