[使用HttpConnection从Android下载图像获得了410,而邮递员获得了200

问题描述 投票:0回答:3

我在Android中将图像降级时遇到问题。

有问题的图片链接:https://via.placeholder.com/150/92c952

我可以使用邮递员成功下载图像(200)。但是,当我在Android中使用HttpConnection进行编码时,它会以错误状态代码410响应我。(然后触发FileNotFounedException。)

下面是我的代码,


        URL url = new URL(fileURL);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        int responseCode = httpConn.getResponseCode();

        // always check HTTP response code first
        if (responseCode == HttpURLConnection.HTTP_OK) {
            String fileName = "";
            String disposition = httpConn.getHeaderField("Content-Disposition");
            String contentType = httpConn.getContentType();
            int contentLength = httpConn.getContentLength();

            if (disposition != null) {
                // extracts file name from header field
                int index = disposition.indexOf("filename=");
                if (index > 0) {
                    fileName = disposition.substring(index + 10,
                            disposition.length() - 1);
                }
            } else {
                // extracts file name from URL
                fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1,
                        fileURL.length());
            }

            System.out.println("Content-Type = " + contentType);
            System.out.println("Content-Disposition = " + disposition);
            System.out.println("Content-Length = " + contentLength);
            System.out.println("fileName = " + fileName);

            // opens input stream from the HTTP connection
            InputStream inputStream = httpConn.getInputStream();

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            int bytesRead = -1;
            byte[] buffer = new byte[1024];
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            outputStream.close();
            inputStream.close();

            System.out.println("File downloaded");
            httpConn.disconnect();
            return outputStream.toByteArray();
        } else {
            httpConn.disconnect();
            throw new RuntimeException("Error code: " + responseCode);
        }

我的代码可以从Imgur成功下载图像,但是对于此链接,它失败。

请分享任何想法,我非常感谢!

java android https httpconnection
3个回答
0
投票

如果要下载图像并将其显示在ImageView上,则可以使用glidepicasso。它很容易实现,只要滑行就可以

Glide.with(context).load("https://via.placeholder.com/150/92c952").into(myImageView);

0
投票

使用此方法从URL下载图像

// DownloadImage AsyncTask
    private class DownloadImage extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Bitmap doInBackground(String... URL) {

            String imageURL = URL[0];

            Bitmap bitmap = null;
            try {
                // Download Image from URL
                InputStream input = new java.net.URL(imageURL).openStream();
                // Decode Bitmap
                bitmap = BitmapFactory.decodeStream(input);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {

//将此位图设置为图像视图//现在使用此位图保存内存中的图像,我保存了内部内存

                if (result != null) {
                    File destination = new File(getActivity().getCacheDir(),
                            "profile" + ".jpg");
                    try {
                        destination.createNewFile();
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        result.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
                        byte[] bitmapdata = bos.toByteArray();

                        FileOutputStream fos = new FileOutputStream(destination);
                        fos.write(bitmapdata);
                        fos.flush();
                        fos.close();
                        selectedFile = destination;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }



        }
    }

现在像这样调用此方法

new DownloadImage().execute("https://via.placeholder.com/150/92c952");

0
投票

这很简单。

原因不在您的Java程序端,而是在服务器端。

服务器拒绝您的连接并回复HTTP 410 Gone

要躲避服务器的行为,只需在执行实际请求之前在您的请求上设置任何流行的User-Agent字符串。

HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpCon.setRequestProperty(
    "User-Agent",
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ja-JP-mac; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
);
int responseCode = httpConn.getResponseCode();
...
© www.soinside.com 2019 - 2024. All rights reserved.