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

比如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的更多相关文章

  1. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

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

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

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

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  4. Java下载https文件上传到阿里云oss服务器

    Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...

  5. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  6. java+web+大文件上传下载

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  7. Java开发系列-文件上传

    概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...

  8. Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案

    import java.io.File;   import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...

  9. Java开发之文件上传

    文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...

随机推荐

  1. DCT变换、DCT反变换、分块DCT变换

    一.引言 DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能.DCT变换本身是无损 ...

  2. Openstack 网络服务 Neutron介绍和控制节点部署 (九)

    Neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目. 早期的时候是没有neutron,早期所使用的网络的nova-network,经过版本改变才有个 ...

  3. IDE和SDK

    像我这种不是专科班出来的,真的很多概念都不太清楚,今天来说说IDE和SDK 简单的来说: IDE(集成开发环境 Integrated Development Environment) 就是我们编写代码 ...

  4. springmvc常用注解标签详解-推荐

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  5. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

  6. HDU 1867 A + B for you again 字符匹配

    解题报告:给你两个字符串,让你连接起来,没有前后顺序,要求是长度最短优先,其次是字典序最小.这题我用的是KMP,做两次匹配,分别把第一次跟第二次输入的字符串放前面,然后比较两次得到的字符窜的长度和字典 ...

  7. Oracle 修改用户名

    1.开始- 运行 - 输入“CMD” 确定 2.在弹出来的窗口中,输入:SQLPLUS / AS SYSDBA  回车 3.然后,用命令修改:alter user 用户名 identified by ...

  8. python垃圾回收三之标记清除

    #第一组循环引用# a = [1,2] b = [3,4] a.append(b) b.append(a) del a ## #第二组循环引用# c = [4,5] d = [5,6] c.appen ...

  9. [Alg::Trick]小白鼠找毒酒

    题目来源:牛客网 https://www.nowcoder.com/questionTerminal/c26c4e43c77440ee9497b20118871bf1 8瓶酒一瓶有毒,用人测试.每次测 ...

  10. innodb和myisam数据库文件存储详解以及mysql表空间

    数据库常用的两种引擎有Innodb和Myisam,关于二者的区别参考:https://www.cnblogs.com/qlqwjy/p/7965460.html 1.关于数据库的存储在两种引擎的存储是 ...