Telegram, Java: загрузить файл для отправки в sendAnimation - PullRequest
0 голосов
/ 06 мая 2019

В Telegram API есть метод , который называется sendAnimation.Есть два обязательных параметра: chat_id и animation.Описание animation таково:

Тип : InputFile или String

Описание : анимация для отправки.Передайте file_id как String для отправки анимации, существующей на серверах Telegram (рекомендуется), передайте HTTP-URL в виде String для Telegram, чтобы получить анимацию из Интернета, или загрузите новую анимацию, используя multipart / form-data.Подробнее об отправке файлов »

У меня есть локальный файл .gif, который я хочу отправить.Похоже, мне нужно использовать этот метод multipart/form-data.Я не понимаю, что это за метод.Я проверил описание типа InputFile:

InputFile Этот объект представляет содержимое файла для загрузки.Должны быть опубликованы с использованием multipart / form-data обычным способом, которым файлы загружаются через браузер.

Опять же, они пишут об этом multipart/form-data, но не пишут, что именно это.

Я подумал, что, возможно, я мог бы загрузить файл, используя метод sendDocument, но загруженный документ также должен иметь тип InputFile.

Как сделать объект InputFileиз моего местного .gif?Я могу преобразовать его в Java InputStream, но это все.

1 Ответ

1 голос
/ 06 мая 2019

просто multipart / form-data - это просто тип шифрования для отправляемых данных. Существует три типа шифрования в формах:

  • application / x-www-form-urlencoded (по умолчанию)
  • многочастному / форм-данных
  • текст / обычный

для получения дополнительной информации о multipart / form-data, проверьте эту ссылку

Я не знаю, каков тип вашего объекта GIF в java, но давайте рассмотрим его как двоичный файл, тогда вы просто разместите этот текст следующим образом, используя запрос POST:

String url = "uploading url";
String charset = "UTF-8";
String param = "value";
File binaryFile = new File("/path/to/file.bin");
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
String CRLF = "\r\n"; // Line separator required by multipart/form-data.

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

try {
    OutputStream output = connection.getOutputStream();
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
     // Send binary file.
    writer.append("--" + boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
    writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
    writer.append("Content-Transfer-Encoding: binary").append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(binaryFile.toPath(), output);
    output.flush(); // Important before continuing with writer!
    writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

    // End of multipart/form-data.
    writer.append("--" + boundary + "--").append(CRLF).flush();
}

// Request is lazily fired whenever you need to obtain information about response.
int responseCode = ((HttpURLConnection) connection).getResponseCode();
System.out.println(responseCode); // Should be 200
...