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 ...
随机推荐
- jQuery-ui datepicker的使用演示代码
这两天使用jquery做一个web端展示的工具,遇到了不少问题也学到了不少知识.其中有一个就是在页面中显示日期选择器的功能,通过百度直接使用的是jquery datepicker 看到一篇使用说明很不 ...
- IOS开发-OC学习-Foundation框架练习
OC语言Foundation框架中字典.字符串.数组的应用: NSString *string = @"China|Usa|France"; NSArray *array = [s ...
- cocos2d-x 定时器selector的使用 :schedule的使用
在游戏设计时,我们需要不断的改变屏幕显示来反映游戏操作的效果,最简单的就是提示用户已经进行的游戏时间.为此,我们需要使用cocos2d-x内置的任务调度机制,即CCNode的schedule成员函数. ...
- 利用Selenium和Browsermob批量嗅探下载Bilibili网站视频
Rerence: http://www.liuhao.me/2016/09/20/selenium_browsermob_sniff_bilibili_video/ 日常生活中,用电脑看视频是非常频繁 ...
- apue- chapter 1 UNIX基础知识
1.C++实现ls命令 #include<dirent.h> #include<stdlib.h> #include<iostream> #include &quo ...
- PHP简单分页类
<?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记录数 * ...
- 使用布局(Layout资源)
实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...
- linux iptables 配置
1.查看已有配置 iptables -L -n 2.清除原有规则. iptables -F 清除预设表filter中的所有规则链的规则 iptables -X 清除预设表f ...
- 选项卡(TabHost)的功能与用法
TabHost是一种非常实用的组件,TabHost可以很方便地在窗口上放置多个便签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆法区域.通过这种方式,就可以在一个容器里放置更多组件,例如手机 ...
- BNU Online Judge-34976-数细菌
题目链接 http://www.bnuoj.com/bnuoj/problem_show.php?pid=34976 题目分析通过a b可以设x,y x+y=a x+3*y=b 解出x,y, ...