Загрузка изображения из Android с использованием HttpConnection получила 410, но почтальон получил 200 - PullRequest
0 голосов
/ 17 апреля 2020

Я столкнулся с проблемой при загрузке изображения в Android.

Проблематичная c ссылка на изображение: 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, но по этой ссылке ничего не получается.

Пожалуйста, поделитесь любой идеей, я очень признателен!

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Используйте этот метод для загрузки изображения с 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 голосов
/ 17 апреля 2020

Это довольно простая причина.

Причина не на вашей 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();
...
0 голосов
/ 17 апреля 2020

Если вы хотите загрузить изображение и показать его на ImageView, вы можете использовать glide или picasso . его довольно легко реализовать, на скольжении вы можете просто

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