1

Android: downloading file from 100+ KB to 1 KB

 2 years ago
source link: https://www.codesd.com/item/android-downloading-file-from-100-kb-to-1-kb.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Android: downloading file from 100+ KB to 1 KB

advertisements

I'm was able to parse an xml file and I want to download the files given its url by the xml. I have the following codes:

    try{
        /* Create a URL we want to load some xml-data from. */
        URL url = new URL("http://dev2.eacomm.com/tabletcms/tablets/sync_login/jayem30/jayem");
        url.openConnection();
        /* Get a SAXParser from the SAXPArserFactory. */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();

        /* Get the XMLReader of the SAXParser we created. */
        XMLReader xr = sp.getXMLReader();
        /* Create a new ContentHandler and apply it to the XML-Reader*/
        ExampleHandler myExampleHandler = new ExampleHandler();
        xr.setContentHandler(myExampleHandler);

        /* Parse the xml-data from our URL. */
        xr.parse(new InputSource(url.openStream()));
        /* Parsing has finished. */

        /* Our ExampleHandler now provides the parsed data to us. */
        List<ParsedExampleDataSet> parsedExampleDataSet = myExampleHandler.getParsedData();

        Iterator i;
        i = parsedExampleDataSet.iterator();
        ParsedExampleDataSet dataItem;

        while(i.hasNext()){
                dataItem = (ParsedExampleDataSet) i.next();
                String folder = dataItem.getParentTag();

                if( folder == "Videos"  ){

                    String [] videoName = dataItem.getName().split("/");
                    String currentFile = videoName[0] + "." + videoName[1];
                    String currentFileURL = dataItem.getUrl() + videoName[0] + "." + videoName[1];
                    tv.append("\nURL: " + currentFileURL);

                    new DownloadFileAsync().execute(currentFile , currentFileURL, "Videos");
                    this.videoCount++;
                    tv.append("\nVideo Count: " + this.videoCount );
                }

                if( folder == "Slideshows" ){
                    //processSlideshows(dataItem, folder);
                }
        }

    }catch(Exception e){
        Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    }

The download code is on the async task. However, when I run this, the two files I'm supposedly downloaded (126kb and 98kb) is downloaded, the files are there but their sizes are both 1kb only. the file doesn't play.

when I change the line

**new DownloadFileAsync().execute(currentFile , currentFileURL, "Videos");**
to
**new DownloadFileAsync().execute("hehe.flv", "http://dev2.eacomm.com/tabletcms/app/webroot/files/000002/videos/27.flv", "Videos");**

the file size is fine but it returns only one file.

EDIT:

//---------------------------- START DownloadFileAsync -----------------------//
class DownloadFileAsync extends AsyncTask<String, String, String>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... strings) {

        try {
            String currentFile = strings[0];
            String currentFileURL = strings[1];
            String folder = strings[2];

            File root = Environment.getExternalStorageDirectory();
            URL u = new URL(currentFileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            int lenghtOfFile = c.getContentLength();

            FileOutputStream f = new FileOutputStream(new File(root + "/Engagia/Downloads/" + folder, currentFile));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;

            while ((len1 = in.read(buffer)) > 0) {
                total += len1; //total = total + len1
                publishProgress("" + (int)((total*100)/lenghtOfFile));
                f.write(buffer, 0, len1);
            }
            f.close();
        }catch (Exception e){
            Log.d("Downloader", e.getMessage());
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC",progress[0]);
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

}
//---------------------------- END DownloadFileAsync -----------------------//

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS:
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading files...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(true);
            mProgressDialog.show();
            return mProgressDialog;
        default:
            return null;
    }

}

EDIT: (thanks to Haphazard)

My bad, I rechecked my URL and I found out that my XML stream does not return the correct url for download so I had to reconstruct a URL for download. I did something like:

tv.append("\nCurrent File URL: " + currentFileURL);
String downloadFileURL = currentFileURL.replace( "tablets/tablet_content", "app/webroot/files" );


Ensure your URLs are formed properly. Have you confirmed that currentFile and currentFileURL are both correct?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK