Загрузка файла из URL с использованием HttpURLConnection | HTTP 400, если имя файла содержит пробел - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь загрузить файлы из url (запрос мыла), используя http-соединение, и ниже приведен мой код, при выполнении я получаю http = 400, поскольку имя файла содержит пробел (ac abc.pdf)

        String downloadFileName = "ac abc.pdf";
        String saveDir = "D:/download";

        String baseUrl = "abc.com/AttachmentDownload?Filename=";
        URL url = new URL(baseUrl + downloadFileName);
        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setReadTimeout(60 * 1000);
        connection.setConnectTimeout(60 * 1000);

        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/octet-stream");
        connection.setRequestProperty("SOAPAction", url.toString());

        String userCredentials = "user:pass";
        connection.setRequestProperty("Authorization", userCredentials);

        connection.setDoInput(true);
        connection.setDoOutput(true);

        int responseCode = connection.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) {

            try (InputStream inputStream = connection.getInputStream()) {
                String saveFilePath = saveDir + downloadFileName;

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

при выполнении вышеприведенного кода, получая приведенный ниже вывод

responsecode400
response messageBad Request
No file to download. Server replied HTTP code: 400

, дайте мне знать, как мы можем отформатировать URL в описанной выше ситуации

1 Ответ

0 голосов
/ 13 июня 2018

Пробелы и некоторые другие символы не очень хорошо переносятся в URL.Вам необходимо экранировать или закодировать их, измените код

URL url = new URL(baseUrl + downloadFileName);

На:

URL url = new URL(baseUrl + URLEncoder.encode(downloadFileName, StandardCharsets.UTF_8.name());

Это должно решить вашу проблему.Кроме того, есть библиотеки с открытым исходным кодом, которые решают вашу проблему для вас.См. Apache commons , который является популярным решением.Другое решение - библиотека MgntUtils (версия 1.5.0.2).Он содержит класс HttpClient, который позволяет вам делать вещи очень просто:

httpClient.sendHttpRequestForBinaryResponse(baseUrl + URLEncoder.encode(downloadFileName, StandardCharsets.UTF_8.name()", HttpClient.HttpMethod.POST);

Возвращает ByteBuffer, который содержит ответ в виде необработанных байтов.Этот же класс имеет метод sendHttpRequest для получения текстового ответа.Оба метода выдают IOException в случае сбоя.Вот ссылка на статью, в которой объясняется, где взять библиотеку MgntUtils , а также какие у нее есть утилиты.В статье класс HttpClient не упоминается (это новая функция), но библиотека поставляется с хорошо написанным Javadoc.Так что ищите javadoc для класса HttpClient в этой библиотеке.

...