2015-11-05 19 views
1

看來,DownloadManager沒有正確解析URL中的國際字符。無法從使用DownloadManager的名稱中的國際字符的URL下載文件

private DownloadManager mTestDl; 

public void downloadTest() { 
    mTestDl = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    BroadcastReceiver br = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 

      DownloadManager.Query q = new DownloadManager.Query(); 
      q.setFilterById(referenceId); 
      Cursor c = mTestDl.query(q); 
      if (!c.moveToFirst()) { 
       Log.i(TAG, "No downloaded file"); 
      } 
      else { 
       c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
       for (String cn : c.getColumnNames()) { 
        String value = c.getString(c.getColumnIndex(cn)); 
        int intValue = c.getInt(c.getColumnIndex(cn)); 
        Log.i(TAG, "XColumn: " + cn + ". Value: " + value + ". int value: " + intValue); 
       } 
      } 
     } 
    }; 

    registerReceiver(br, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

    Uri uri = Uri.parse("http://media.sample.com/video/[요기요]_11월_냠냠냠.mp4"); 
    DownloadManager.Request request = new DownloadManager.Request(uri); 
    long dlid = mTestDl.enqueue(request); 
    Log.v(TAG, "download ID: " + dlid); 
} 

,其結果是:

XColumn: _id. Value: 4141. int value: 4141 
XColumn: local_filename. Value: null. int value: 0 
XColumn: mediaprovider_uri. Value: null. int value: 0 
XColumn: destination. Value: 2. int value: 2 
XColumn: title. Value: . int value: 0 
XColumn: description. Value: . int value: 0 
XColumn: uri. Value: http://media.sample.com/video/[요기요]_11월_냠냠냠.mp4. int value: 0 
XColumn: status. Value: 403. int value: 16 
XColumn: hint. Value: null. int value: 0 
XColumn: media_type. Value: null. int value: 0 
XColumn: total_size. Value: -1. int value: -1 
XColumn: last_modified_timestamp. Value: 1446747064114. int value: -656914638 
XColumn: bytes_so_far. Value: 0. int value: 0 
XColumn: allow_write. Value: 0. int value: 0 
XColumn: local_uri. Value: content://downloads/my_downloads/4141. int value: 0 
XColumn: reason. Value: placeholder. int value: 403 

一般來說,HTTP狀態403意思是 「未經授權的訪問」。在這種情況下,儘管主機是Amazon S3,當試圖列出文件夾的內容時,它會給出403。所以,這個假設是URL不正確。

是否DownloadManager支持下載具有國際名稱的文件?

編輯:標題

+0

請更改您的文章的主題,因爲它不是文件,而是包含它們的網址。 – greenapps

回答

0

回答我的問題下載成功,如果編碼使用URLEncoder的的URL中的文件名: 此行開關:

Uri uri = Uri.parse("http://media.sample.com/video/[요기요]_11월_냠냠냠.mp4"); 

這一個:

Uri uri = Uri.parse("http://media.sample.com/video/" + URLEncoder.encode("[요기요]_11월_냠냠냠.mp4", "UTF-8")); 

現在文件下載成功完成。我只能使用代理服務器捕獲HTTP請求來進行調試。 DownloadManager沒有提示。

相關問題