java中远程http文件上传及file2multipartfile

工作中有时会遇到各种需求,你得变着法儿去解决,当然重要的是在什么场景中去完成。

比如Strut2中file类型如何转换成multipartfile类型,找了几天,发现一个变通的方法记录如下(虽然最后没有用上。。):

 1 private static MultipartFile getMulFileByPath(String picPath) {
 2
 3         FileItem fileItem = createFileItem(picPath);
 4
 5         MultipartFile mfile = new CommonsMultipartFile(fileItem);
 6
 7         return mfile;
 8
 9     }
10
11
12
13 private static FileItem createFileItem(String filePath)
14
15     {
16
17         FileItemFactory factory = new DiskFileItemFactory(16, null);
18
19         String textFieldName = "textField";
20
21         int num = filePath.lastIndexOf(".");
22
23         String extFile = filePath.substring(num);
24
25         FileItem item = factory.createItem(textFieldName, "text/plain", true,
26
27             "MyFileName" + extFile);
28
29         File newfile = new File(filePath);
30
31         int bytesRead = 0;
32
33         byte[] buffer = new byte[4096];
34
35         try
36
37         {
38
39             FileInputStream fis = new FileInputStream(newfile);
40
41             OutputStream os = item.getOutputStream();
42
43             while ((bytesRead = fis.read(buffer, 0, 8192))
44
45                 != -1)
46
47             {
48
49                 os.write(buffer, 0, bytesRead);
50
51             }
52
53             os.close();
54
55             fis.close();
56
57         }
58
59         catch (IOException e)
60
61         {
62
63             e.printStackTrace();
64
65         }
66
67         return item;
68
69     }  

file2multipartfile

好不容易写好了一个完整的远程上传方法,并且本地测试已经通过能用,提交后发现有个类实例化不了,debug发现是包不兼容问题(尴尬),

但是以前别人用过的东西,你又不能升级,主要是没权限,不得不去低级的版本中找变通的类似方法,即便方法已经过时了。。

//httpclient(4.5.3)远程传输文件工具类

  1 public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception {
  2
  3         String res = ""; // 请求返回默认的支持json串
  4
  5         Map<String, String> map = new HashMap<String, String>();
  6                 ContentType ctype = ContentType.create("content-disposition","UTF-8");
  7
  8         Map<String, String> map = new HashMap<String, String>();
  9
 10         HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
 11
 12         CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
 13
 14         String res = ""; // 请求返回默认的支持json串
 15
 16         HttpResponse httpResponse = null;
 17
 18         try {
 19
 20             HttpPost httpPost = new HttpPost(driverUrl);
 21
 22             //设置请求和传输超时时间
 23
 24             RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(5000).build();
 25
 26             httpPost.setConfig(requestConfig);
 27
 28             // BTW 4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。
 29
 30             if(httpPost!=null){
 31
 32                 if("formdata".equals(multipart)){
 33
 34                     MultipartEntityBuilder mentity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
 35
 36                     Set<String> keyset = param.keySet();
 37
 38                     for (String key : keyset) {
 39
 40                         Object paramObj = Validate.notNull(param.get(key));
 41
 42                         if(paramObj instanceof MultipartFile) {
 43
 44                             mentity.addBinaryBody(key, ((MultipartFile) paramObj).getInputStream(),ctype,((MultipartFile) paramObj).getOriginalFilename());
 45
 46                         }else if(paramObj instanceof File){
 47
 48                             mentity.addBinaryBody(key, (File)paramObj);//(key, new FileInputStream((File)paramObj),ctype,((File)paramObj).getName());
 49
 50                         }else{
 51
 52                             mentity.addPart(key,new StringBody(paramObj.toString(),ctype));
 53
 54                             //mentity.addTextBody(key,paramObj.toString());
 55
 56                         }
 57
 58                         logger.info("key::::"+key);
 59
 60                         logger.info("paramObj::::"+paramObj.toString());
 61
 62                     }
 63
 64                     HttpEntity entity = mentity.build();
 65
 66                     HttpUriRequest post =  RequestBuilder.post().setUri(driverUrl).setEntity(entity).build();
 67
 68                     httpResponse = closeableHttpClient.execute(post);
 69
 70                 }else {
 71
 72                     HttpEntity entity = convertParam(param, contentType);
 73
 74                     httpPost.setEntity(entity);
 75
 76                     httpResponse = closeableHttpClient.execute(httpPost);
 77
 78                 }
 79
 80                 if(httpResponse == null) {
 81
 82                     throw new Exception("无返回结果");
 83
 84                 }
 85
 86                 // 获取返回的状态码
 87
 88                 int status = httpResponse.getStatusLine().getStatusCode();
 89
 90                 logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status);
 91
 92                 if(status == HttpStatus.SC_OK){
 93
 94                     HttpEntity entity2 = httpResponse.getEntity();
 95
 96                     InputStream ins = entity2.getContent();
 97
 98                     res = toString(ins);
 99
100                     ins.close();
101
102                 }else{
103
104                     InputStream fis = httpResponse.getEntity().getContent();
105
106                     Scanner sc = new Scanner(fis);
107
108                     logger.info("Scanner:::::"+sc.next());
109
110                     logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status);
111
112                 }
113
114                 map.put("code", String.valueOf(status));
115
116                 map.put("result", res);
117
118                 logger.info("执行Post方法请求返回的结果 = " + res);
119
120             }
121
122         } catch (ClientProtocolException e) {
123
124             map.put("code", HttpClientUtil.CLIENT_PROTOCOL_EXCEPTION_STATUS);
125
126             map.put("result", e.getMessage());
127
128         } catch (UnsupportedEncodingException e) {
129
130             map.put("code", HttpClientUtil.UNSUPPORTED_ENCODING_EXCEPTION_STATUS);
131
132             map.put("result", e.getMessage());
133
134         } catch (IOException e) {
135
136             map.put("code", HttpClientUtil.IO_EXCEPTION_STATUS);
137
138             map.put("result", e.getMessage());
139
140         } finally {
141
142             try {
143
144                 closeableHttpClient.close();
145
146             } catch (IOException e) {
147
148                 logger.error("调用httpClient出错", e);
149
150                 throw new Exception("调用httpClient出错", e);
151
152             }
153
154         }
155
156
157
158 private static String toString(InputStream in) throws IOException{
159
160         ByteArrayOutputStream os = new ByteArrayOutputStream();
161
162         byte[] b = new byte[1024];
163
164         int len;
165
166         while((len = in.read(b)) != -1) {
167
168             os.write(b, 0, len);
169
170         }
171
172         return os.toString("UTF-8");
173
174     }
175 }

4.53包下http远程文件上传

//httpclient(4.2.2)老版本远程传输文件工具类

 1 public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception {
 2
 3         String res = ""; // 请求返回默认的支持json串
 4
 5         Map<String, String> map = new HashMap<String, String>();
 6
 7         ContentType ctype = ContentType.create("content-disposition","UTF-8");
 8
 9         HttpPost httpPost = new HttpPost(driverUrl);
10
11         MultipartEntity reqEntity = new MultipartEntity();
12
13         Set<String> keyset = param.keySet();
14
15         File tempFile = new File(picPath);
16
17         for (String key : keyset) {
18
19             Object paramObj = Validate.notNull(param.get(key));
20
21             if(paramObj instanceof File) {
22
23                 FileBody fileBody = new FileBody(tempFile);
24
25                 reqEntity.addPart(key, fileBody);
26
27             }else{
28
29                 reqEntity.addPart(key,new StringBody(paramObj.toString()));
30
31             }
32
33             logger.info("key::::"+key);
34
35             logger.info("paramObj::::"+paramObj.toString());
36
37         }
38
39         httpPost.setEntity(reqEntity);
40
41         HttpClient httpClient = new DefaultHttpClient();
42
43         HttpResponse httpResponse = httpClient.execute(httpPost);
44
45         // 获取返回的状态码
46
47         int status = httpResponse.getStatusLine().getStatusCode();
48
49         logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status);
50
51         if(status == HttpStatus.SC_OK){
52
53             HttpEntity entity2 = httpResponse.getEntity();
54
55             InputStream ins = entity2.getContent();
56
57             res = toString(ins);
58
59             ins.close();
60
61         }else{
62
63             InputStream fis = httpResponse.getEntity().getContent();
64
65             Scanner sc = new Scanner(fis);
66
67             logger.info("Scanner:::::"+sc.next());
68
69             logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status);
70
71         }
72
73         map.put("code", String.valueOf(status));
74
75         map.put("result", res);
76
77         logger.info("执行Post方法请求返回的结果 = " + res);
78
79         return map;
80
81     }

4.2.2版本http远程传输文件工具类

希望对大家有点帮助!平常心。

原文地址:https://www.cnblogs.com/lq147760524/p/9349959.html

时间: 2024-08-29 01:56:39

java中远程http文件上传及file2multipartfile的相关文章

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

Java中实现文件上传下载的三种解决方案

第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream();// 把文件读入 String filePath = request.getRealPath(fileAddre);//取系统当前路径

【Java】JavaWeb文件上传和下载

文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功能.common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载.用该组件可实现一次上传一个或多个文件,并可限制文件大小. 开发环境 创建一个javaweb项目,加入common-f

java+web+大文件上传下载

文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用HTML5的API,对文件上传进行渐进式增强:     * iframe上传  * ajax上传  * 进度条  * 文件预览  * 拖放上传 1.1 传统形式 文件上传的传统形式,是使用表单元素file,参考 http://www.ruanyifeng.com/blog/2012/08/file_

java基础篇---文件上传(组件)

文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传的原理的? 废话不多说直接上代码 import java.io.*; import java.util.*; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.Fil

java里面的文件上传与下载

文件的上传与下载主要用到两种方法:1.方法一:commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传,下载 [upload]package com.handson.bbs.servlet; import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.Se

Java FTPClient实现文件上传下载

在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件.所用到的jar包有:  commons-net-1.4.1.jar  jakarta-oro.jar 一.上传文件 文件上传源代码 文件上传源代码    /**   * Description: 向FTP服务器上传文件   * @Version1.0   * @param url FTP服务器ho

java web(四)文件上传与下载

一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通过为表单元素设置 method="post" enctype="multipart/form-data" 属性 ,让表单提交的数据以二进制编码的方式提交,在接受此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传. 2.表单encty

使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及解决方案

import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.Upload; public class U