将.zip文件转换成字符串进行传送(以支付宝对账单为例

转载自:http://blog.csdn.net/myfmyfmyfmyf/article/details/52517187

本例主要是将.zip的压缩文件,转换成string类型,进数据传送。有的读者要问干嘛不用stream流呢,可以用流,现在不支持流又该怎么弄呢,可以用byte[],那byte[]也不支持呢,那就乖乖用String吧。

主要思想是通过byte[]将文件类型转换成String类型,有以下几种方式:

注意:不要直接toString()

方法一:

byte[]转String

byte[] temp = new byte[1024];
int b;
while ((b = fis.read(temp)) != -1) {
outstream.write(temp, 0, b);
}
String转byte[]
fileStr.getBytes("ISO-8859-1")

方法二:

BASE64Encoder encoder = new BASE64Encoder();
while ((b = inputstream.read(temp)) != -1) {
fileStr+= encoder.encode(temp);
 }
String转byte[]
BASE64Decoder decoder = new BASE64Decoder();
byte[] appByte = decoder.decodeBuffer(fileStr);
 ftpOutstream.write(appByte);

方法三:

读者自己写转换吧

 

本编博客以支付宝的电子对账单为例,奇怪的是电子对账单直接用支付宝流转成string,居然出错,最后一个文件错误,大小不变文件却缺失,没办法只能先保存在本地,然后读取本地文件流,用完再删除了,代码在下面↓↓↓↓↓↓↓↓↓↓↓↓

 

 

[java] view plain copy
 
  1. package com.pay;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.net.HttpURLConnection;  
  8. import java.net.URL;  
  9. import java.util.ArrayList;  
  10. import java.util.List;  
  11. import java.util.Map;  
  12. import java.util.zip.ZipOutputStream;  
  13. import javax.servlet.http.HttpServletResponse;  
  14. import net.sf.json.JSONObject;  
  15. import org.codehaus.jackson.map.ObjectMapper;  
  16. import sun.misc.BASE64Decoder;  
  17. import sun.misc.BASE64Encoder;  
  18. import com.alipay.api.AlipayClient;  
  19. import com.alipay.api.DefaultAlipayClient;  
  20. import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest;  
  21. import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse;  
  22. import com.log.AppLogUtil;  
  23. import com.service.ReceiverHandler;  
  24.   
  25. /** 
  26.  * @author muyunfei 
  27.  *  
  28.  * <p>Modification History:</p>  
  29.  * <p>QQ       Author      Description</p> 
  30.  * <p>------------------------------------------------------------------</p> 
  31.  * <p>1147417467           牟云飞             新建</p> 
  32.  */  
  33. public class AliZipDemo{  
  34.   
  35.     /** 
  36.      * 获得对账单数据流(.zip),并将.zip通过byte[]保存成string进行传送 
  37.      * String获得后转成byte[],然后保存成.zip 
  38.      */  
  39.     public String sendZipByStr() {  
  40.         try{  
  41.             String aliGateWay="https://openapi.alipay.com/gateway.do";//支付宝网关  
  42.             String dateStr="2016-09-09";//日期  以天为最低单位  2016-09-06  
  43.             String appId="***********";//appid  
  44.             //商户私钥  
  45.             String privateKey="********************************************************";  
  46.             String strType="json";//数据格式  
  47.             String chartType="utf-8";//编码格式  
  48.             //支付宝公钥  
  49.             String aliPublicKey="************************************************";  
  50.             AlipayClient alipayClient = new DefaultAlipayClient(aliGateWay,appId,privateKey,strType,chartType,aliPublicKey);  
  51.             AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();  
  52.             request.setBizContent("{" +  
  53.             "    \"bill_type\":\"trade\"," +  
  54.             "    \"bill_date\":\""+dateStr+"\"" +  
  55.             "  }");  
  56.             AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);  
  57.             //获得下载对账单地址  
  58.             System.out.println(response.getBillDownloadUrl());  
  59.             System.out.println(response.getCode());  
  60.             System.out.println(response.getMsg());  
  61.             if(response.isSuccess()){  
  62.                 //调用成功,下载对账文件  
  63.                 String urlStr=response.getBillDownloadUrl();  
  64.                 try {  
  65.                     //创建文件链接  
  66. //                  URL url = new URL("https://zos.alipayobjects.com/rmsportal/sDdxhkwUKuHUDLe.png");  
  67.                     URL url = new URL(urlStr);  
  68.                     HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();  
  69.                     //设置链接参数  
  70.                     httpUrlConnection.setConnectTimeout(5 * 1000);  
  71.                     httpUrlConnection.setDoInput(true);//打开输入输出流  
  72.                     httpUrlConnection.setDoOutput(true);  
  73.                     httpUrlConnection.setUseCaches(false);  
  74.                     httpUrlConnection.setRequestMethod("GET");  
  75.                     httpUrlConnection.setRequestProperty("Charsert", "UTF-8");  
  76.                     httpUrlConnection.setRequestProperty("Connection", "Keep-Alive");    
  77.                     //建立链接  
  78.                     httpUrlConnection.connect();  
  79.                     //获得输入流,文件为zip格式,  
  80.                     //支付宝提供  
  81.                     //20886126836996110156_20160906.csv.zip内包含  
  82.                     //20886126836996110156_20160906_业务明细.csv  
  83.                     //20886126836996110156_20160906_业务明细(汇总).csv  
  84.                     InputStream fis = httpUrlConnection.getInputStream();  
  85.                     //从url中获得文件名downloadFileName=20886126836996110156_20160909.csv.zip  
  86.                     //直接将流转换成字符串出现zip内最后一个文件异常,只能先保存到本地,然后进行转换  
  87.                     String filename=getDownloadFileName(urlStr);  
  88.                     File file = new File(filename+".zip");  
  89.                     FileOutputStream outstream = new FileOutputStream(file);  
  90.                     //将获得数据流转换成byte,然后转成String,向内网传送  
  91.                     byte[] temp = new byte[1024];  
  92.                     int b;  
  93.                     while ((b = fis.read(temp)) != -1) {  
  94. //                      fileStr+=byte2hex(temp);  
  95. //                      fileStr+=new String(temp,"ISO-8859-1");  
  96.                         outstream.write(temp, 0, b);  
  97.                     }  
  98.                     outstream.flush();  
  99.                     outstream.close();  
  100.                     fis.close();  
  101.                     //获取本地文件转换成字符换  
  102.                     File file2 = new File(filename+".zip");  
  103.                     FileInputStream inputstream=new FileInputStream(file2);//本地文件的输入流  
  104.                     String fileStr="";//内网传送数据,file的转byte的字符串  
  105.                     BASE64Encoder encoder = new BASE64Encoder();  
  106.                     while ((b = inputstream.read(temp)) != -1) {  
  107.                         fileStr+= encoder.encode(temp);  
  108.                     }  
  109.                     inputstream.close();  
  110.                     System.out.println("文件1:"+fileStr);  
  111.                     //删除本地文件  
  112.                     file2.delete();  
  113.                     //测试保存文件  
  114.                     File ftpfile=new File("G:/"+filename+"2222222222222.zip");  
  115.                     FileOutputStream ftpOutstream = new FileOutputStream(ftpfile);  
  116.                     BASE64Decoder decoder = new BASE64Decoder();  
  117.                     byte[] appByte = decoder.decodeBuffer(fileStr);  
  118.                     ftpOutstream.write(appByte);  
  119.                       
  120. //                  outstream.write(fileStr.getBytes("ISO-8859-1"));  
  121.                     ftpOutstream.flush();  
  122.                     ftpOutstream.close();  
  123.                     System.out.println("ok");  
  124.                     //成功向内网传送  
  125.                     return "{\"code\": 1,\"result\": \""+fileStr+"\"}";  
  126.                 } catch (Exception e) {  
  127.                     AppLogUtil.getAppLoger().error("从支付宝获取对账单,根据对账单地址获取对账单异常:" + e.getMessage());   
  128.                     e.printStackTrace();  
  129.                     return createErrorMsg("fail").toString();  
  130.                 }   
  131.             } else {  
  132.                 AppLogUtil.getAppLoger().error("从支付宝获取对账单,获取对账单地址失败");   
  133.                 return createErrorMsg("fail").toString();  
  134.             }  
  135.         }catch(Exception e){  
  136.             AppLogUtil.getAppLoger().error("从支付宝获取对账单,获取对账单地址失败:" + e.getMessage());   
  137.             e.printStackTrace();  
  138.             return createErrorMsg("fail").toString();  
  139.         }  
  140.     }  
  141.   
  142.       
  143.     /** 
  144.      * 生成错误信息 
  145.      * @param msg 
  146.      * @return 
  147.      */  
  148.     private JSONObject createErrorMsg(String msg){  
  149.         String error="{\"code\": 1,\"result\": \""+msg+"\"}";  
  150.         return JSONObject.fromObject(error) ;  
  151.     }  
  152. <span style="white-space:pre">    </span>//获取文件名  
  153.     private String getDownloadFileName(String urlStr){  
  154.         String tempStr = urlStr.substring(urlStr.indexOf("downloadFileName")+17, urlStr.length());  
  155.         tempStr = tempStr.substring(0,tempStr.indexOf(".zip"));  
  156.         return tempStr;  
  157.     }  
  158.   
  159. }  
  160. 自己总结如下:====由zip文件获取base64字符串的工具类
  161. public class GetBytesFromFileUtils {
    public static String getBase64StringFromZip(String pathname) throws IOException {
    File f = new File(pathname);
    FileInputStream is = null;
    String fileStr = null;
    try {
    is = new FileInputStream(f);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    BASE64Encoder encoder = new BASE64Encoder();
    byte[] temp = new byte[1024];
    int b;
    while ((b = is.read(temp)) != -1) {
    fileStr+= encoder.encode(temp);
    }
    return fileStr;
    }
    }
posted @ 2018-01-05 14:08  pursuevip  阅读(1746)  评论(0编辑  收藏  举报