在Android应用程序如何从谷歌appengine下载blob

时间:2013-11-03 10:46:27

标签: java android google-app-engine

我有一个appengine应用程序从blob-store提供zip文件。 当我使用此URL +查询时:

http://spiceappcloud.appspot.com/bundle-service?spice_category=Education&spice_sub_category0=Topography&spice_sub_category1=Outdoor%20Skills&spice_name=Topo.zip

从Chrome或Firefox下载文件!如何在Android应用程序中的服务中下载相同的文件?

我很感激代码。

1 个答案:

答案 0 :(得分:0)

好的,我使用HttpClient& amp; HttpGet。

private boolean downloadFile(String query) 
    {
        Log.d(TAG, "trying to download file");

        boolean downloadSuccessful = false;

        if(!fileName.endsWith(".zip"))
        {
            fileName += ".zip"; 
            Log.d(TAG, "added zip to file name");
        }    

        is = null;
        bis = null;
        fos = null;
        bos = null;
        outFile = null;

        int counter = 0;

        while(!downloadSuccessful && counter < 5)
        {
            Log.d(TAG + ".downloadFile()", "attempt number: " + counter);

            try
            {
                //connect(query);
                HttpClient client = new DefaultHttpClient();

                HttpGet httpGet = new HttpGet(query);
                HttpResponse response = null;

                try 
                {
                  response = client.execute(httpGet);

                  StatusLine statusLine = response.getStatusLine();
                  int statusCode = statusLine.getStatusCode();

                  Log.d(TAG, "statusCode: " + statusCode);

                  if (statusCode == 200) 
                  {
                    HttpEntity entity = response.getEntity();

                    is = entity.getContent();
                    bis = new BufferedInputStream(is);
                  } 
                  else 
                  {
                    Log.e(TAG, "Failed to download file");
                  }
                } 
                catch (ClientProtocolException e) 
                {
                    Log.e(TAG, e.getMessage());
                } 
                catch (IOException e) 
                {
                    Log.e(TAG, e.getMessage());
                }


                Header[] hs = response.getAllHeaders();

                if(hs == null)
                {
                    Log.e(TAG, "Headers are null ");
                    return false;
                }

                for(Header h: hs)
                {
                    Log.d(TAG, "Header values: " + h.getValue());
                }



                fileSize = 200000;

                if(counter == 0)
                {
                    Log.e(TAG, "File size is: " + fileSize);
                }
                else
                {
                    Log.e(TAG, "This is what's left to download: " + fileSize);
                }

                sendNotifiction("Connecting", "Connecting...", "Spice bundle: " + fileName);
                updateUser(MESSAGE_CONNECTING_STARTED, fileSize / 1024);

                outFile = new File(ZIP_LOCATION + "/" + fileName);
                fos = new FileOutputStream(outFile);
                bos = new BufferedOutputStream(fos, DOWNLOAD_BUFFER_SIZE);
                data = new byte[DOWNLOAD_BUFFER_SIZE];
                bytesRead = 0; 
                totalRead = 0;

                downloadSuccessful = download();


                Log.d(TAG, "Total bytes Read: " + totalRead + " of: " + fileSize);

                if(totalRead == fileSize)
                {
                    downloadSuccessful = true;

                    Log.e(TAG, "Download successful use this message wairily");
                }
                else
                {
                    Log.e(TAG, "Download fubar");
                }
            }
            catch(FileNotFoundException e)
            {
                Log.e(TAG, "FileNotFoundException: " + e.getMessage());
                notificationFlash = "Error downloading";
                notificationTitle = "Error";
                notificationText = "Spice bundle: " + fileName;

                sendNotifiction(notificationFlash, notificationTitle, notificationText);
                updateUser(MESSAGE_DOWNLOAD_ERROR, 0);
            }
            catch(NullPointerException e)
            {
                Log.e(TAG, "NullPointerException");
            }
            catch(IllegalStateException e)
            {
                Log.e(TAG, e.getMessage());
            }
            catch(Exception e)
            {
                Log.e(TAG, "Exception: " + e.getMessage());

                notificationFlash = "Error downloading";
                notificationTitle = "Error";
                notificationText = "Spice bundle: " + fileName;

                sendNotifiction(notificationFlash, notificationTitle, notificationText);
                updateUser(MESSAGE_DOWNLOAD_ERROR, 0);
            }

            counter++;
        }

        try 
        {
            if(bos != null)
            {
                bos.close();
            }

            if(fos != null)
            {
                fos.close();
            }

            if(bis != null)
            {
                bis.close();
            }

            if(is != null)
            {
                is.close();
            }
        } 
        catch (IOException e) 
        {
            Log.e(TAG + " given up downloading", "IOException thrown");

            notificationFlash = "Error downloading";
            notificationTitle = "Error";
            notificationText = "Spice bundle: " + fileName;

            sendNotifiction(notificationFlash, notificationTitle, notificationText);
            updateUser(MESSAGE_DOWNLOAD_ERROR, 0);
        }

        return downloadSuccessful;
    }

    private boolean download() 
    {
        boolean downloadComplete = false;

        try
        {
            while(!this.isCancelled())
            {
                bytesRead = bis.read(data, 0, data.length);

                if( bytesRead < 0)
                {
                    downloadComplete = true;
                    break;
                }

                bos.write(data, 0, bytesRead);

                totalRead += bytesRead;
                int totalReadInKB = totalRead / 1024;

                if(totalReadInKB % 100 == 0)
                {
                    Log.d(TAG, "Total Read In KB: " + totalReadInKB + " of: " + fileSize/1024);
                    updateUser(MESSAGE_UPDATE_PROGRESS_BAR, totalReadInKB);
                }
            }
        }
        catch(IOException e)
        {
            Log.e(TAG + ".download()", e.getMessage());
            Log.e(TAG + ".download()", "IOException thrown download incomplete");
        }
        finally
        {
            try 
            {
                bos.flush();
            } 
            catch (IOException e) 
            {
                Log.e(TAG + ".download()", e.getMessage());
                Log.e(TAG + ".download()", "IOException thrown couldn't flush");
            }
        }

        return downloadComplete;
    }