java中远程http文件上传及file2multipartfile
工作中有时会遇到各种需求,你得变着法儿去解决,当然重要的是在什么场景中去完成。
比如Strut2中file类型如何转换成multipartfile类型,找了几天,发现一个变通的方法记录如下(虽然最后没有用上。。):
private static MultipartFile getMulFileByPath(String picPath) { FileItem fileItem = createFileItem(picPath); MultipartFile mfile = new CommonsMultipartFile(fileItem); return mfile; } private static FileItem createFileItem(String filePath) { FileItemFactory factory = new DiskFileItemFactory(16, null); String textFieldName = "textField"; int num = filePath.lastIndexOf("."); String extFile = filePath.substring(num); FileItem item = factory.createItem(textFieldName, "text/plain", true, "MyFileName" + extFile); File newfile = new File(filePath); int bytesRead = 0; byte[] buffer = new byte[4096]; try { FileInputStream fis = new FileInputStream(newfile); OutputStream os = item.getOutputStream(); while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } return item; }
file2multipartfile
好不容易写好了一个完整的远程上传方法,并且本地测试已经通过能用,提交后发现有个类实例化不了,debug发现是包不兼容问题(尴尬),
但是以前别人用过的东西,你又不能升级,主要是没权限,不得不去低级的版本中找变通的类似方法,即便方法已经过时了。。
//httpclient(4.5.3)远程传输文件工具类
public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception { String res = ""; // 请求返回默认的支持json串 Map<String, String> map = new HashMap<String, String>();
ContentType ctype = ContentType.create("content-disposition","UTF-8"); Map<String, String> map = new HashMap<String, String>(); HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); CloseableHttpClient closeableHttpClient = httpClientBuilder.build(); String res = ""; // 请求返回默认的支持json串 HttpResponse httpResponse = null; try { HttpPost httpPost = new HttpPost(driverUrl); //设置请求和传输超时时间 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(5000).build(); httpPost.setConfig(requestConfig); // BTW 4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。 if(httpPost!=null){ if("formdata".equals(multipart)){ MultipartEntityBuilder mentity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532); Set<String> keyset = param.keySet(); for (String key : keyset) { Object paramObj = Validate.notNull(param.get(key)); if(paramObj instanceof MultipartFile) { mentity.addBinaryBody(key, ((MultipartFile) paramObj).getInputStream(),ctype,((MultipartFile) paramObj).getOriginalFilename()); }else if(paramObj instanceof File){ mentity.addBinaryBody(key, (File)paramObj);//(key, new FileInputStream((File)paramObj),ctype,((File)paramObj).getName()); }else{ mentity.addPart(key,new StringBody(paramObj.toString(),ctype)); //mentity.addTextBody(key,paramObj.toString()); } logger.info("key::::"+key); logger.info("paramObj::::"+paramObj.toString()); } HttpEntity entity = mentity.build(); HttpUriRequest post = RequestBuilder.post().setUri(driverUrl).setEntity(entity).build(); httpResponse = closeableHttpClient.execute(post); }else { HttpEntity entity = convertParam(param, contentType); httpPost.setEntity(entity); httpResponse = closeableHttpClient.execute(httpPost); } if(httpResponse == null) { throw new Exception("无返回结果"); } // 获取返回的状态码 int status = httpResponse.getStatusLine().getStatusCode(); logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status); if(status == HttpStatus.SC_OK){ HttpEntity entity2 = httpResponse.getEntity(); InputStream ins = entity2.getContent(); res = toString(ins); ins.close(); }else{ InputStream fis = httpResponse.getEntity().getContent(); Scanner sc = new Scanner(fis); logger.info("Scanner:::::"+sc.next()); logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status); } map.put("code", String.valueOf(status)); map.put("result", res); logger.info("执行Post方法请求返回的结果 = " + res); } } catch (ClientProtocolException e) { map.put("code", HttpClientUtil.CLIENT_PROTOCOL_EXCEPTION_STATUS); map.put("result", e.getMessage()); } catch (UnsupportedEncodingException e) { map.put("code", HttpClientUtil.UNSUPPORTED_ENCODING_EXCEPTION_STATUS); map.put("result", e.getMessage()); } catch (IOException e) { map.put("code", HttpClientUtil.IO_EXCEPTION_STATUS); map.put("result", e.getMessage()); } finally { try { closeableHttpClient.close(); } catch (IOException e) { logger.error("调用httpClient出错", e); throw new Exception("调用httpClient出错", e); } } private static String toString(InputStream in) throws IOException{ ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len; while((len = in.read(b)) != -1) { os.write(b, 0, len); } return os.toString("UTF-8"); }
}
4.53包下http远程文件上传
//httpclient(4.2.2)老版本远程传输文件工具类
public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception { String res = ""; // 请求返回默认的支持json串 Map<String, String> map = new HashMap<String, String>(); ContentType ctype = ContentType.create("content-disposition","UTF-8"); HttpPost httpPost = new HttpPost(driverUrl); MultipartEntity reqEntity = new MultipartEntity(); Set<String> keyset = param.keySet(); File tempFile = new File(picPath); for (String key : keyset) { Object paramObj = Validate.notNull(param.get(key)); if(paramObj instanceof File) { FileBody fileBody = new FileBody(tempFile); reqEntity.addPart(key, fileBody); }else{ reqEntity.addPart(key,new StringBody(paramObj.toString())); } logger.info("key::::"+key); logger.info("paramObj::::"+paramObj.toString()); } httpPost.setEntity(reqEntity); HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpPost); // 获取返回的状态码 int status = httpResponse.getStatusLine().getStatusCode(); logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status); if(status == HttpStatus.SC_OK){ HttpEntity entity2 = httpResponse.getEntity(); InputStream ins = entity2.getContent(); res = toString(ins); ins.close(); }else{ InputStream fis = httpResponse.getEntity().getContent(); Scanner sc = new Scanner(fis); logger.info("Scanner:::::"+sc.next()); logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status); } map.put("code", String.valueOf(status)); map.put("result", res); logger.info("执行Post方法请求返回的结果 = " + res); return map; }
4.2.2版本http远程传输文件工具类
希望对大家有点帮助!平常心。
java中远程http文件上传及file2multipartfile的更多相关文章
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- Java中实现文件上传下载的三种解决方案
第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- Java下载https文件上传到阿里云oss服务器
Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...
- 【Java】JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- Java开发系列-文件上传
概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...
- Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案
import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...
- Java开发之文件上传
文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...
随机推荐
- win32 ini
原文:https://www.cnblogs.com/qq78292959/archive/2012/06/10/2544389.html Windows操作系统专门为此提供了6个API函数来对配置设 ...
- duilib踩坑记录
duilib官方 https://github.com/duilib/duilib duilib他人扩展 https://github.com/qdtroy/DuiLib_Ultimate 关于两者的 ...
- JS原型继承与类的继承
我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- springMvc + Maven 项目提示 hessian 依赖包 无法下载;
首先 从 https://github.com/alibaba/dubbo/archive/master.zip 下载最新的 dubbo 源码包到本地某个目录, 解压出来: cmd 进入该目录: 执行 ...
- 20155201 2016-2017-2 《Java程序设计》第五周学习总结
20155201 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 异常处理 程序设计本身的错误,建议使用Exception或其子类实例来表现,称错误处 ...
- Git Pull Failed: cannot lock ref 'refs/remotes/origin/xxxxxxxx': unable to resolve ref
1.xxxxxxxx代表目录名称,我要pull的目录是supman_creditmall_v5: 2.从代码库中pull代码时报这个错误,代码pull失败: 3.解决办法,看下图,删除文件后再pull ...
- 为什么mysqlbinlog --database选项不起作用
群里看到有同学提问,多瞅了眼 [root@mysql55 mysql]# mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql ...
- vistual studio 去除 git 源代码 绑定
第一次碰到这个问题,想将源代码签入TFS管理.添加到源码管理后,默认添加到Git源码管理. 研究过后,发现: 1)删除框内文件 2)Vs->工具->选项->源代码管理->插件管 ...
- rank over partition by
高级函数,分组排序 over: 在什么条件之上. partition by e.deptno: 按部门编号划分(分区). order by e.sal desc: 按工资从高到低排序(使用rank() ...
- SpringMVC_HelloWorld_01
通过配置文件的方式实现一个简单的HelloWorld. 源码 一.新建项目 1.新建动态web项目 2.命名工程springmvc-01 3.勾选"Generate web.xml depl ...