【问题标题】:Download Zip file using volley android使用 volley android 下载 Zip 文件
【发布时间】:2015-07-07 12:20:42
【问题描述】:

我想通过 volley 使用 get 调用下载 zip 文件。现在我可以使用:Download and Extract Zip File in Android 下载文件。

我想改用 volley 库。我该怎么做?

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    这是我使用 volley 下载 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));
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2017-10-22
      • 2015-10-18
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多