Android:未从网址下载完整文件

时间:2012-10-03 11:25:11

标签: android android-asynctask

在我的应用中,我要求从网址下载mp3文件。我正在使用Async Task下载文件。出于测试目的,我将文件保存在Dropbox中。问题是,它没有下载完整的文件。实际文件大小为5 MB。但是,它只下载29 KB的数据。当我检查内容的长度时,它显示-1。我不知道问题出在哪里。下面,我发布了我的代码。

@Override
    protected Void doInBackground(String... sUrl) 
    {
        InputStream input = null;
        OutputStream output = null;
        try 
        {
            URL link = new URL(sUrl[0]);
            HttpURLConnection urlConnection = (HttpURLConnection)link.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoOutput(true);
            urlConnection.connect();
            int fileLength = urlConnection.getContentLength();
            Log.v("Download file length", ""+fileLength);
            input = urlConnection.getInputStream();
            int downloadedSize = 0;
            output = new FileOutputStream(Environment.getExternalStorageDirectory()
                    .getAbsolutePath()+"/audiofolder/1.mp3.mp3");

            byte[] data = new byte[1024];
            int bufferLength = 0;

            while (((bufferLength = input.read(data)) > 0)) 
            {
                output.write(data, 0, bufferLength);
                downloadedSize += bufferLength;
                publishProgress((int)((downloadedSize/fileLength) * 100));
            }//while
            output.flush();
            output.close();
            input.close();
        }//try 
        catch (MalformedURLException e) 
        {
            e.printStackTrace();
        }//catch
        catch (IOException e) 
        {
            e.printStackTrace();
        }//catch
        return null;
    }//diInBackground

3 个答案:

答案 0 :(得分:0)

在我的应用程序中,以下代码完美地运行。你可以尝试一下。

    @Override
    protected Void doInBackground(String... aurl) {

        try {

            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            File file = new File("mnt/sdcard/");
            file.mkdirs();
            File outputfile = new File(file, title + ".mp3");
            FileOutputStream fileOutput = new FileOutputStream(outputfile);
            InputStream inputStream = conexion.getInputStream();
            int totalSize = conexion.getContentLength();
            int downloadedSize = 0;
            byte[] buffer = new byte[1024];
            int bufferLength = 0;  
            while ((bufferLength = inputStream.read(buffer)) != -1) {
                downloadedSize += bufferLength;
                onProgressUpdate((int) ((downloadedSize * 100) / totalSize));
                fileOutput.write(buffer, 0, bufferLength);
            }
            fileOutput.close();
        } catch (Exception e) {
            download = true;
            e.printStackTrace();

        }
        return null;

    }

答案 1 :(得分:0)

检查您的链接。 当您看到内容的长度= -1时,表示链接标题中没有内容长度。它不会强制您的下载进度。 您只下载29KB因为它下载网站,.html不是文件mp3。 Yout可以将您的链接复制并粘贴到浏览器上以进行检查。

答案 2 :(得分:0)

来自Android文档:

https://developer.android.com/reference/java/net/URLConnection.html#getContentLength()

getContentLength返回:

此连接的URL引用的资源的内容长度,如果内容长度未知,或者内容长度大于Integer.MAX_VALUE,则为-1。