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 ...
随机推荐
- java系列--MD5加密
方案一: /** * 1.对文本进行32位小写MD5加密 * @param plainText 要进行加密的文本 * @return 加密后的内容 */ public static String te ...
- 如何在Eclipse中配置python开发环境
考虑到网上关于Eclipse中配置Python开发环境的文章千篇一律,故写此文以总结. 本文主要内容是:三种Pydev配置方法和一种PyDev卸载方法. 本文的前提是你已经安装了Eclipse和pyt ...
- 差分硬盘的merge(合并差异)实验分析
实验: 1:在c:中新建father.vhd,及其差分硬盘son.vhd,command: diskpart create vdisk file=c:\father.vhd #建立父硬盘 ...
- Cracking the code interview
推荐一本书<Cracking the code interview> Now in the 5th edition, Cracking the Coding Interview gives ...
- HDU-2077-汉诺塔IV
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2077 这题就我个人认为比较难,做了很久,递推关系式一直找不出正确的来,找很多递推关系,提交了很多次,全 ...
- Java 字符终端上获取输入三种方式
http://blog.csdn.net/hongweigg/article/details/14448731 在Java 字符终端上获取输入有三种方式: 1.java.lang.System.in ...
- 游戏开发之UE4添加角色到场景中
接着上次继续学习,现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中.要这样做,我们必须从UE4的GameFramework类继承它. 一. 创建一个从Character类继承的类 从基 ...
- 用《VisualStudio命令提示》生成WSDL客户端文件
1.找到vs命令提示符并且以管理员方式打开. 2.输入:wsdl + wsdl文件路径(可以为url).如:“wsdl http://localhost:30373/PDAWebService/SH3 ...
- 移动端H5页面遇到的问题总结
最近刚做完一个移动端的项目,产品之无敌,过程之艰辛,我就不多说了,记录下在这个项目中遇到的问题,以防万一,虽然这些可能都是已经被N多前辈解决掉了的问题,也放在这里,算是为自己漫漫前端路铺了一颗小石子儿 ...
- python中关于局部变量与全局变量的认识
1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量,例如: num = 100 def func(): num = ...