2015-04-28 172 views

回答

-1

這是我用怎麼下載zip文件凌空:

package basavaraj.com.myapplicationtwo; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.Calendar; 
import java.util.Enumeration; 
import java.util.Random; 
import java.util.StringTokenizer; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import android.os.Environment; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.Response.ErrorListener; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.HurlStack; 
import com.android.volley.toolbox.Volley; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.HashMap; 

public class MainActivity extends AppCompatActivity implements Response.Listener<byte[]>, ErrorListener { 
    EditText eText; 
    Button download, unzip; 
    boolean flag = false; 
    private static Random random = new Random(Calendar.getInstance().getTimeInMillis()); 
    private ProgressDialog mProgressDialog; 
    String unzipLocation = Environment.getExternalStorageDirectory() + "/mycatalog"; 
    String zipFile; 

    InputStreamVolleyRequest request; 
    int count; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     download = (Button) findViewById(R.id.download); 
     unzip = (Button) findViewById(R.id.unzip); 
     download.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /*DownloadMapAsync mew = new DownloadMapAsync(); 
       mew.execute("https://docs.google.com/uc?export=download&id=0BwxIiPT46CGHMWFTX0o4bzMzYU0");*/ 
       String mUrl="https://docs.google.com/uc?export=download&id=0BwxIiPT46CGHMWFTX0o4bzMzYU0"; 
       request = new InputStreamVolleyRequest(Request.Method.GET, mUrl, MainActivity.this, MainActivity.this, null); 
       RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), 
         new HurlStack()); 
       mRequestQueue.add(request); 
       mProgressDialog = new ProgressDialog(MainActivity.this); 
       mProgressDialog.setMessage("Downloading Zip File.."); 
       mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       mProgressDialog.setCancelable(false); 
       mProgressDialog.show(); 
      } 
     }); 
     unzip.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /*if (flag) {*/ 
        try { 
         unzip(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

     }); 

    } 
    @Override 
    public void onResponse(byte[] response) { 
     HashMap<String, Object> map = new HashMap<String, Object>(); 
     try { 
      if (response!=null) { 

       //Read file name from headers 
       String content =request.responseHeaders.get("Content-Disposition") 
         .toString(); 
       StringTokenizer st = new StringTokenizer(content, "="); 
       /*String arrTag = st.toString(); 

       String filename = arrTag;*/ 
       String filename = content.split("'")[2]; 
       filename = filename.replace(":", "."); 
       Log.d("DEBUG::RESUME FILE NAME", filename); 

       try{ 
        long lenghtOfFile = response.length; 

        //covert reponse to input stream 
        InputStream input = new ByteArrayInputStream(response); 
        File path = Environment.getExternalStorageDirectory(); 
        File file = new File(path, filename); 
        zipFile = file.toString(); 
        map.put("resume_path", file.toString()); 
        BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file)); 
        byte data[] = new byte[1024]; 

        long total = 0; 

        while ((count = input.read(data)) != -1) { 
         total += count; 
         output.write(data, 0, count); 
        } 

        output.flush(); 
        output.close(); 
        input.close(); 
        mProgressDialog.dismiss(); 
       }catch(IOException e){ 
        e.printStackTrace(); 

       } 
      } 
     } catch (Exception e) { 
      mProgressDialog.dismiss(); 
      // TODO Auto-generated catch block 
      Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE"); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onErrorResponse(VolleyError error) { 
     mProgressDialog.dismiss(); 
     Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE. ERROR:: "+error.getMessage()); 
    } 

    public void unzip() throws IOException { 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setMessage("Please Wait...Extracting zip file ... "); 
     mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.show(); 
     new UnZipTask().execute(zipFile, unzipLocation); 
    } 


    private class UnZipTask extends AsyncTask<String, Void, Boolean> { 
     @SuppressWarnings("rawtypes") 
     @Override 
     protected Boolean doInBackground(String... params) { 
      String filePath = params[0]; 
      String destinationPath = params[1]; 

      File archive = new File(filePath); 
      try { 


       ZipFile zipfile = new ZipFile(archive); 
       for (Enumeration e = zipfile.entries(); 
        e.hasMoreElements();) { 
        ZipEntry entry = (ZipEntry) e.nextElement(); 
        unzipEntry(zipfile, entry, destinationPath); 
       } 


       UnzipUtil d = new UnzipUtil(zipFile, unzipLocation); 
       d.unzip(); 

      } catch (Exception e) { 

       return false; 
      } 

      return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      mProgressDialog.dismiss(); 

     } 


     private void unzipEntry(ZipFile zipfile, ZipEntry entry, 
           String outputDir) throws IOException { 

      if (entry.isDirectory()) { 
       createDir(new File(outputDir, entry.getName())); 
       return; 
      } 

      File outputFile = new File(outputDir, entry.getName()); 
      if (!outputFile.getParentFile().exists()) { 
       createDir(outputFile.getParentFile()); 
      } 

      // Log.v("", "Extracting: " + entry); 
      BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry)); 
      BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); 

      try { 

      } finally { 
       outputStream.flush(); 
       outputStream.close(); 
       inputStream.close(); 


      } 
     } 

     private void createDir(File dir) { 
      if (dir.exists()) { 
       return; 
      } 
      if (!dir.mkdirs()) { 
       throw new RuntimeException("Can not create dir " + dir); 
      } 
     } 
    } 


} 



UnzipUtil.java 


package basavaraj.com.myapplicationtwo; 
import android.util.Log; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 


public class UnzipUtil { 
    private String _zipFile; 
    private String _location; 

    public UnzipUtil(String zipFile, String location) { 
    _zipFile = zipFile; 
    _location = location; 

    _dirChecker(""); 
    } 

    public void unzip() { 
    try { 
     FileInputStream fin = new FileInputStream(_zipFile); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) { 
     Log.v("Decompress", "Unzipping " + ze.getName()); 

     if(ze.isDirectory()) { 
      _dirChecker(ze.getName()); 
     } else { 
      FileOutputStream fout = new FileOutputStream(_location + ze.getName()); 
     // for (int c = zin.read(); c != -1; c = zin.read()) { 
     // fout.write(c); 


      byte[] buffer = new byte[8192]; 
      int len; 
      while ((len = zin.read(buffer)) != -1) { 
       fout.write(buffer, 0, len); 
      } 
      fout.close(); 

     // } 

      zin.closeEntry(); 
     // fout.close(); 
     } 

     } 
     zin.close(); 
    } catch(Exception e) { 
     Log.e("Decompress", "unzip", e); 
    } 

    } 

    private void _dirChecker(String dir) { 
    File f = new File(_location + dir); 

    if(f.isDirectory()) { 
     f.mkdirs(); 
    } 
    } 
} 



InputStreamVolleyRequest.java 


    package basavaraj.com.myapplicationtwo; 

    /** 
    * Created by VISHAL on 4/5/2017. 
    */ 

    import com.android.volley.AuthFailureError; 
    import com.android.volley.NetworkResponse; 
    import com.android.volley.Request; 
    import com.android.volley.Response; 
    import com.android.volley.toolbox.HttpHeaderParser; 

    import java.util.HashMap; 
    import java.util.Map; 


    public class InputStreamVolleyRequest extends Request<byte[]> { 
     private final Response.Listener<byte[]> mListener; 
     private Map<String, String> mParams; 
     //create a static map for directly accessing headers 
     public Map<String, String> responseHeaders; 

     public InputStreamVolleyRequest(int post, String mUrl, Response.Listener<byte[]> listener, 
             Response.ErrorListener errorListener, HashMap<String, String> params) { 
      // TODO Auto-generated constructor stub 

      super(post, mUrl, errorListener); 
      // this request would never use cache. 
      setShouldCache(false); 
      mListener = listener; 
      mParams = params; 
     } 

     @Override 
     protected Map<String, String> getParams() 
       throws com.android.volley.AuthFailureError { 
      return mParams; 
     } 

     ; 


     @Override 
     protected void deliverResponse(byte[] response) { 
      mListener.onResponse(response); 
     } 

     @Override 
     protected Response<byte[]> parseNetworkResponse(NetworkResponse response) { 

      //Initialise local responseHeaders map with response headers received 
      responseHeaders = response.headers; 

      //Pass the response data here 
      return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response)); 
     } 
    }