在移动数据上下载二进制文件时错误的Mime-Type(Android)

时间:2016-04-30 21:12:11

标签: java android

我尝试使用以下方式下载二进制文件:

URL url = new URL(urlStr);
HttpURLConnection ucon = (HttpURLConnection) url.openConnection();
ucon.connect();
InputStream is = new BufferedInputStream(ucon.getInputStream());

通过移动数据运行时(在Samsung Galaxy 4,Android 5.0.1上),我收到以下回复

j���UFEHLER��6ERROR��`Заявеното съдържание не може да бъде заредено ��&Wrong MIME-Type���Fback��2

这意味着"请求的内容无法加载"保加利亚语(我从保加利亚下载的服务器)。但更多信息似乎" 错误的MIME类型"在回复结束时。

我使用HttpGet尝试相同但没有结果。 奇怪的是,当我通过Wifi执行相同的请求时一切正常。 此外,我可以从浏览器下载移动数据上的文件,但不能下载代码。此外,我还通过移动数据在联想上使用Android 4.4.2进行了测试,并且还可以使用。

我注意到,当通过移动数据连接时,我获得了Content-Type: application/vnd.wap.wmlc(已记录ucon.getResponseCode()),并且在通过WiFi时没有设置为内容类型。

有什么想法吗? :/

1 个答案:

答案 0 :(得分:0)

这是我的文件下载工作代码。您可以查看是否遗漏了某些内容。

public class ImageDownloaderAsyncTask extends
            AsyncTask<Void, Integer, Integer> {

    private static File f;

    protected void doInBackground() throws IOException {

        File dir = new File(Constants.FILE_PATH);
        if (!dir.exists()) dir.mkdir();
        f = new File(Constants.FILE_PATH + Constants.FILE_NAME);

        if (f != null && !f.exists()) {
            f.createNewFile();
        }

        try {
            URL url = new URL(fileUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();

            InputStream input = connection.getInputStream();
            String data1 = f.getPath();
            FileOutputStream stream = new FileOutputStream(data1);

            byte data[] = new byte[4096];
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                }
                stream.write(data, 0, count);      
            }
            stream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected Integer doInBackground(Void... params) {
        try {
            doInBackground();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return 1;
    }

    protected void onPostExecute(Integer result) {}
}