android文件下载-解析带有响应头信息的文件流

03-02 22:51:44   来源:admin   评论: 点击:

下载以InputStream响应,响应中包含有header,boundary,文件字节码等信息,如何进行解析呢:从文件格式可以分析出:只需要将header信息与文件字节码分离即可得到文件。
下载以InputStream响应,响应中包含有header,boundary,文件字节码等信息,如何进行解析呢:从文件格式可以分析出:只需要将header信息与文件字节码分离即可得到文件。下面是具体文件格式:
a.图片文件格式:
 
--__boundary_www_test_com__
Content-Type: application/json; charset=utf-8
Content-Length: 267
 
{"stat":"ok","response":"xxxx"}
--__boundary_www_test_com__
Content-Type: image/jpeg;name=taken_pic_201232417045267.jpg
Content-Transfer-Encoding: binary
Content-Length:153508
 
������������������������������������������������������������
������������������������������������������������������������
��������������������������������������������
�����������������������������������������������
.................................������
--__boundary_www_test_com__--
b、视屏文件格式:
 
 
--__boundary_www_test_com__
Content-Type: application/json; charset=utf-8
Content-Length: 267
 
 
{"stat":"ok","response":""}
--__boundary_www_test_com__
Content-Type: video/3gpp;name=video-1232323.mp4
Content-Transfer-Encoding: binary
Content-Length:29795665
 
 
������������������������������������������������������������
������������������������������������������������������������
��������������������������������������������
��������������������������������������������������
.................................������
--__boundary_www_test_com__--
 
 
下面是文件解析工具类:
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.ArrayList;
 
import android.util.Log;
 
public class MimeParser {
 
     /**
      * Parse the MIME data to Image/JPG files.
      *
      * @param mimeFilePath the path of the MIME data file
      * @param storagePath the location of the parse result will be saved
      */
     public void parser(String mimeFilePath, String storagePath) {
           try {
              FileInputStream in = new FileInputStream(mimeFilePath);
               this.parser(in, storagePath);
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          }
     }
 
     /**
      * Parse the MIME data to Image/JPG files.
      * @param input an object of InputStream
      * @param storagePath the location of the parse result will be saved
      */
     public void parser(InputStream input, String storagePath) {
          String boundary = "--__boundary_www_test_com__" ;
           byte[] boundaryBytes = boundary.getBytes();
 
           try {
              ArrayList<Byte> list = new ArrayList<Byte>();
              
               // reads all the binary data and stores to a list
               byte buffer[] = new byte[1024];
               int count;
               while ((count = input.read(buffer)) != -1) {
                    for ( int i = 0; i < count; i++) {
                        list.add(buffer[i]);
                   }
              }
              input.close();
 
              ArrayList<Integer> boundIndexs = new ArrayList<Integer>();
               for ( int i = 0; i < list.size(); i++) {
                    byte b = list.get(i);
                    if (b == boundaryBytes[0]) {
                         boolean find = compare(list, i, boundaryBytes);
                         if (find) {
                             boundIndexs.add(i);
                        }
                   }
              }
 
               for (Integer index : boundIndexs) {
                    for ( int i = index + boundaryBytes.length; i < list.size() - 4; i++) {
                         if (list.get(i) == 0x0D && list.get(i + 1) == 0x0A && list.get(i + 2) == 0x0D && list.get(i + 3) == 0x0A) {
                             Byte[] bytes = list.subList(index, i).toArray(new Byte[0]);
                              byte[] bs = toByte(bytes);
                             String str = new String(bs);
                             String contentType = getConentType(str);
                              int contentLength = getContentLength(str);
 
                              if (contentType.equals("image/jpeg" )) {
                                  String imageName = getImageName(str);
                                  Byte[] datas = list.subList(i + 4, i + 4 + contentLength).toArray(new Byte[0]);
                                  saveResult(storagePath, imageName, datas);
                             } else if (contentType.equals("application/json" )) {
                                  Byte[] datas = list.subList(i + 4, i + 4 + contentLength).toArray(new Byte[0]);
                                  saveResult(storagePath, "Text" + index + ".txt" , datas);
                             } else {
                            String imageName = getImageName(str);
                            Byte[] datas = list.subList(i + 4, i + 4 + contentLength).toArray(new Byte[0]);
                            saveResult(storagePath, imageName, datas);
                        }
                              break;
                        }
                   }
              }
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
     }
 
 
 
 
     /**
      * 这个方法可以独立的使用
      * Parse the MIME data to Video files.
      * @param input an object of InputStream
      * @param storageDirectory the location of the parse result will be saved
      * @param tempFileDirectory  the location of the temp file will be saved
      */
     public static void parserVideoFile(InputStream input, String storageDirectory,String tempFileDirectory) {
          String boundary = "--__boundary_www_test_com__" ;
          String contentType= "Content-Type:";
          String contentLength= "Content-Length:";
          String contentTransferEncoding="Content-Transfer-Encoding:" ;
          String responseStr= "response";
          String appJson= "application/json";
          String tempFilePath=tempFileDirectory+"video.temp" ;
          BufferedReader reader = null;
          File tempFile= null;
     try{
           //将InputStream保存到临时文件video.temp中
           //save temp file
               byte []saveInputBuffer= new byte[1024];
               int len=0;
              tempFile= new File(tempFilePath);
               if(tempFile.exists()){
                   tempFile.delete();
              }
              FileOutputStream fos= new FileOutputStream(tempFile);
                while((len=input.read(saveInputBuffer))!=-1){
                   fos.write(saveInputBuffer, 0, len);
                   
              }
              fos.flush();
              fos.close();
              input.close();
               //解析出临时文件video.temp中的header信息,并获得字节长度
               //parse temp file and get header info
              reader= new BufferedReader( new InputStreamReader(new FileInputStream(tempFile), "US-ASCII"));//US-ASCII
              String fileName= null;
              StringBuilder sb= new StringBuilder();
               for (String line = null; (line = reader.readLine()) != null ;) {
                   sb.append(line+ "\n");
                    //System.out.println(line);
                   Log. e("MimeParser", line);
                    if( "".equals(line)||line.length()==0){
                    sb.append( "\r\n");
                    continue;
                   } else
                         if(line.contains(boundary)){
                         continue;
                   } else if(line.contains(responseStr)){
                         continue;
                   } else if(line.contains(contentType)){
                         if(!line.contains(appJson)){
                              int index = line.indexOf(";");
                              int length = "name=".length();
                             fileName = line.substring(index + 1 + length).trim();
                        }
                         continue;
                   } else if(line.contains(contentLength)){
                        sb.append( "\r\n");
                         if( null!=fileName){
                              //String []strs=line.split(":");
                              //bineryFileBytesLength=Integer.parseInt( strs[1].trim());
                              break;
                        }
                         continue;
                   } else if(line.contains(contentTransferEncoding)){
                         continue;
                   }
 
                   
              }
              sb.append( "\r\n");
              sb.append( "\n");
              sb.append( "\n");
                //System.out.println(sb.toString().getBytes("US-ASCII").length);
              reader.close();
              //将header信息与文件字节码分离
              RandomAccessFile randomAccessFile= new RandomAccessFile(tempFile,"rw" );
               byte []myBuffer= new byte[1024];
              FileOutputStream myFos= new FileOutputStream(new File(storageDirectory+fileName));
               int  myLength=0;
               randomAccessFile.seek(sb.toString().getBytes( "US-ASCII"). length+1);
                while((myLength=randomAccessFile.read(myBuffer))!=-1){
                   myFos.write(myBuffer,0,myLength);
              }
              myFos.close();
              randomAccessFile.close();
               //删除临时文件
               //delete temp file
               if( null!=tempFile){
                   tempFile.delete();
              }
          } catch(Exception e){
              e.printStackTrace();
          }
     }
     
 
 
     private void saveResult(String storagePath, String fileName, Byte[] datas) {
           if (!( new File(storagePath).exists())) {
               new File(storagePath).mkdirs();
          }
          String filePathName = storagePath + fileName;
           try {
              FileOutputStream out = new FileOutputStream(filePathName);
              out.write(toByte(datas));
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
     }
 
     private byte[] toByte(Byte[] datas) {
           byte[] bs = new byte[datas. length];
           for ( int p = 0; p < bs. length; p++) {
              bs[p] = datas[p];
          }
           return bs;
     }
 
     private String getConentType(String content) {
          String[] lines = content.split( "\n");
           for (String line : lines) {
               if (line.contains( "Content-Type:")) {
                    int index = line.indexOf( ";");
                   String contentType = line.substring("Content-Type:" .length(), index).trim();
                    return contentType;
              }
          }
           return "";
     }
 
     private int getContentLength(String content) {
          String[] lines = content.split( "\n");
           for (String line : lines) {
               if (line.contains( "Content-Length")) {
                    int index = line.indexOf( ":");
                   String contentLength = line.substring(index + 1).trim();
                    return Integer.parseInt(contentLength);
              }
          }
           return 0;
     }
 
     private String getImageName(String content) {
          String[] lines = content.split( "\n");
           for (String line : lines) {
               if (line.contains( "Content-Type:")) {
                    int index = line.indexOf( ";");
                    int length = "name=".length();
                   String name = line.substring(index + 1 + length).trim();
                    return name;
              }
          }
           return "";
     }
 
     private boolean compare(ArrayList<Byte> list, int index, byte[] boundaryBytes) {
           for ( int i = 0; i < boundaryBytes. length; i++) {
               if (list.get(index + i) != boundaryBytes[i])
                    return false;
          }
           return true;
     }
 
     // Test Code
     // //////////////////////////////////////////////////////////////////////////
     public static void main(String[] args) {
          String mimeFilePath = "D:\\mytest.txt";
          String storagePath = "D:\\ParserResult";
           new MimeParser().parser(mimeFilePath, storagePath);
     }
 
}
 
//调用方法:
     public void download(String  auth,String ids, String storeagePath, String thumb,boolean isDownloadVideo) throws ClientProtocolException, IOException{
          
          String url = BASE_URL+"?method=" +Config.REQUEST_METHOD_MEDIA_DOWNLOAD+"&format=json"+ "&media_id="+ids;
          
           if(!StringUtils. isEmpty(thumb)){
              
              url = url + "&thumb_size="+thumb;
          }
          
          Log. e("ids", ids);
          HttpGet httpGet = new HttpGet(url);
          
          httpGet.setHeader( "Content-Type", "text/plain" );
          httpGet.setHeader( "Connection","close" );
          
          httpGet.setHeader( "Authorization", auth);
          
          HttpResponse res = httpClient.execute(httpGet);
          
          InputStream ins = res.getEntity().getContent();
           //Log.e("ins", IOUtils.toString(ins));
          MimeParser mp= new MimeParser();
           if(!isDownloadVideo){
              mp.parser(ins, storeagePath);
          } else{
               mp.parserVideoFile(ins, storeagePath, Main.main.temporaryFilePath );
          }
          
     }
 

相关热词搜索:android

上一篇:android中类似浏览器的用于渲染html的组件:webview详解 下一篇:android-进行网络请求之前先判断网络是否可用
分享到: 收藏