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例子:

1 <form action="gerry/publish/file" enctype="multipart/form-data" method="post">
2 file:<input type="file" name="file"/><br/>
3 <input type="submit" value="submit"/>
4 </form>

如果上传文件,我们必须将enctype设置成"multipart/form-data",表示我们上传的是一个二进制数据流。

3、Servlet中解析这个请求

 1         boolean isMultipart = ServletFileUpload.isMultipartContent(req);
 2         if (isMultipart) {
 3             // 构造一个文件上传处理对象
 4             FileItemFactory factory = new DiskFileItemFactory();
 5             ServletFileUpload upload = new ServletFileUpload(factory);
 6
 7             Iterator items;
 8             try {
 9                 // 解析表单中提交的所有文件内容
10                 items = upload.parseRequest(req).iterator();
11                 while (items.hasNext()) {
12                     FileItem item = (FileItem) items.next();
13                     System.out.println(item.getFieldName());
14                     System.out.println(item.isFormField());
15                     System.out.println(item.getString());
16
17                     if (!item.isFormField()) {
18                         // 取出上传文件的文件名称
19                         String name = item.getName();
20                         // 取得上传文件以后的存储路径
21                         String fileName = name.substring(name.lastIndexOf(‘\\‘) + 1, name.length());
22                         // 上传文件以后的存储路径
23                         String path = req.getRealPath("file") + File.separatorChar + fileName;
24
25                         // 上传文件
26                         File uploaderFile = new File(path);
27                         item.write(uploaderFile);
28                     }
29                 }
30             } catch (Exception e) {
31                 resp.getOutputStream().write(("throw exception " + e.getMessage()).getBytes());
32             }
33         } else {
34             resp.getOutputStream().write("is not this file upload".getBytes());
35         }

通过ServletFileUpload的parseRequest方法可以将文件流和非文件流全部解析出来。不用考虑HttpServletRequest中的数据流格式。

4、Spring中解析这个请求

在Spring中我们可以直接通过MultipartFile来获取请求中的文件流信息。

 1 @RequestMapping(value = "/gerry/publish/file")
 2     @ResponseBody
 3     public String upload1(MultipartFile file) {
 4         String originalFileName = file.getOriginalFilename();
 5         String fileName = file.getName();
 6         System.out.println(originalFileName);
 7         System.out.println(fileName);
 8         System.out.println(file.getContentType());
 9         try {
10             MyHttpClient.addPic(file.getBytes());
11         } catch (Exception e) {
12             return "failure, the exception msg is: " + e.getMessage();
13         }
14         return "success";
15     }

5、代码中构造HttpClient请求,传输文件

 1 /**
 2      * 传输文件流bs
 3      *
 4      * @param bs
 5      *            要传输的文件流
 6      */
 7     public static void addPic(byte[] bs) {
 8         HttpClient httpClient = new DefaultHttpClient();
 9         HttpPost httpPost = new HttpPost(url);
10         MultipartEntity entity = new MultipartEntity();
11         entity.addPart("pic", new ByteArrayBody(bs, "pic"));
12         try {
13             // 添加其他的参数,可以是多个/零个
14             entity.addPart("name", new StringBody("liuming92"));
15         } catch (UnsupportedEncodingException e1) {
16             throw new RuntimeException(e1);
17         }
18         httpPost.setEntity(entity);
19         try {
20             HttpResponse httpResponse = httpClient.execute(httpPost);
21             if (httpResponse != null) {
22                 String result = EntityUtils.toString(httpResponse.getEntity());
23                 System.out.println(result);
24             }
25         } catch (IOException e) {
26             throw new RuntimeException(e);
27         }
28     }

到这里位置,java中上传文件以及向第三方传输文件都实现啦。

时间: 2024-10-15 10:36:55

HttpClient构造文件上传的相关文章

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

上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($_FILES['file']['name']); $target_path = iconv("UTF-8","gb2312", $target_path); if(move_uploaded_file($_FILES['file']['tmp_name'], $targ

Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载

上一篇专题Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信我们讲解了如何使用httpurlconnection来实现基本的文本数据传输.一般在实际开发中我们可以用于传输xml或者json格式的数据.今天我们来讲解另外一种http网络请求的方式:httpclient,并实现文件的上传和下载. 在这里插个题外话,其实这些网络请求有很多第三方jar包可以使用,这些包都封装得很好了.如果只是想使用,我们就直接拿别人得jar包来用就好.博主这里推荐一个叫xuti

使用 HttpClient 进行文件上传

1.使用 AddPart 方法 public static void upload(String authorization,String baseUrl,String filePath,String userId,String isOverWrite,String remotePath){ CloseableHttpClient client = HttpClients.createDefault(); String uploadFile_url = Utils.getValue("uploa

httpclient 实现文件上传中转

开发功能: web前端提交上传文件 -> a服务器接收 -> 转发到b服务器进行文件处理 下面是简单实现的代码,具体细节优化根本自己的需求更改. public String handleResponse(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, IOException { String method = request.getMethod(); S

HttpClient多文件上传

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderful 项目使用技术SpringMVC + spring + mybatis HttpClient技术 1       HttpClientService工具类 该工具类封装了get.post.put.delete以及post上传多个文件等方法:包含了有无参数.日常开发,够用了! 一般来说,有些公司会有

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

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

时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHttpComponents 在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也

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

WebLogic任意文件上传漏洞(CVE-2019-2618) 0x01 漏洞描述 漏洞介绍 CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Management)认证,设置wl_request_type参数为app_upload,构造文件上传格式的POST请求包,上传jsp木马文件,进而可以获得整个服务器的权限. 影响版本 WebLogic 10.3.6.0

CVE-2019-2618 任意文件上传

漏洞描述:CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件.攻击者突破了OAM(Oracle Access Management)认证,设置wl_request_type参数为app_upload,构造文件上传格式的POST请求包,上传jsp木马文件,进而可以获得整个服务器的权限. 受影响WebLogic版本:10.3.6.0.12.1.3.0.12.2.1.3. 这个漏洞比较鸡肋,刚好有靶场,就复现下 漏洞