zoukankan      html  css  js  c++  java
  • 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远程传输文件工具类

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

  • 相关阅读:
    1041 考试座位号
    1040 有几个PAT
    1039 到底买不买
    1038 统计同成绩学生
    1037 在霍格沃茨找零钱
    1036 跟奥巴马一起编程
    1035 插入与归并
    vue-router--路由传参
    vue-router--路由原理
    vuex--在computed中使用
  • 原文地址:https://www.cnblogs.com/lq147760524/p/9349959.html
Copyright © 2011-2022 走看看