在项目中我们有时候需要使用到其他第三方的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构造文件上传的更多相关文章

  1. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

  2. 使用 HttpClient 进行文件上传

    1.使用 AddPart 方法 public static void upload(String authorization,String baseUrl,String filePath,String ...

  3. Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

    上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($ ...

  4. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  5. WebLogic任意文件上传漏洞(CVE-2019-2618)

    WebLogic任意文件上传漏洞(CVE-2019-2618) 0x01 漏洞描述 漏洞介绍 CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口, ...

  6. CVE-2019-2618任意文件上传漏洞复现

    CVE-2019-2618任意文件上传漏洞复现 漏洞介绍: 近期在内网扫描出不少CVE-2019-2618漏洞,需要复测,自己先搭个环境测试,复现下利用过程,该漏洞主要是利用了WebLogic组件中的 ...

  7. CVE-2019-2618 任意文件上传

    漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Ma ...

  8. HttpClient 4.3.* 上传带中文文件名文件文件名乱码问题的解决

    又是折腾了一天才解决的问题,网上关于这个问题的资料不多,希望写出来能帮到有需要的人. 之前无论怎么设置charset都不起作用, 后来看了这篇文章 才发现MultipartEntityBuilder有 ...

  9. HttpClient文件上传下载

    1 HTTP HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪问网络资源. 尽管在 JDK 的 java.net ...

随机推荐

  1. WINDOWS下搭建SVN服务器端的步骤分享(Subversion)

    1.获取svn程序 2.安装 Subversion(以下简称SVN)的服务器端和客户端.下载下来的服务器端是个 zip压缩包,直接解压缩即可,比如我解压到 E:\subversion .客户端安装文件 ...

  2. ireport 取消自动分页,detail不分页,当没有数据的时候显示title

    报表文件属性页面 lgnore pagination 勾选上,就可以取消分页功能.

  3. java web基础 --- URL重定向Filter

    java web基础 --- URL重定向Filter httpRequest.getRequestDispatcher("/helloWorld").forward(httpRe ...

  4. jQuery API 中文文档

    Reference: http://www.css88.com/jqapi-1.9/jQuery.proxy/

  5. Ubuntu14.04 64bit编译u-boot-2016.07提示 Your dtc is too old, please upgrade to dtc 1.4 or newer

    Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. Ubuntu14.04 64bit环境下编译u-boot-2016.07提示如下错误: CHK include/conf ...

  6. 分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器

    http://www.tuicool.com/articles/2eaQJn 用Grunt配置watch和liveReload组件,可以实时检测指定的文件变化并自动刷新浏览器.目前基本已经成为了我的必 ...

  7. 漂亮的PHP验证码

    <?php class Imagecode{ private $width ; private $height; private $counts; private $distrubcode; p ...

  8. css3实战版的点击列表项产生水波纹动画

    1.html+js: <!DOCTYPE html><html><head lang="en">    <meta charset=&qu ...

  9. CSS3动画效果——js调用css动画属性并回调处理详解

    http://www.jb51.net/css/258407.html 这篇文章主要详细介绍了CSS3动画效果回调处理,需要的朋友可以参考下 我们在做js动画的时候,很多时候都需要做回调处理,如在一个 ...

  10. 各种浏览器开启JavaScript脚本方法

    各种浏览器开启JavaScript脚本方法 随着网站设计技术的发展,为了用户友好体验,大部分网站使用了JavaScript脚本设计,如果您的浏览器禁用或关闭的JavaScript支持,那么可能造成网站 ...