Как отправить файл? - PullRequest
       18

Как отправить файл?

0 голосов
/ 02 декабря 2018

Я хочу отправить изображение своему боту-телеграмме через javascript (не Node.js).Для этого мне нужен токен бота и мой идентификатор пользователя Telegram.

Отправка текстовых сообщений работает нормально, мне также удалось отправить фотографии, которые я дал как ССЫЛКА.Теперь я хочу сделать свои собственные фотографии и отправить их непосредственно моему боту.

Это часть документации телеграммы:

enter image description here

Итак, насколько я понял, я также могу отправлять изображения в виде файла, а не в виде ссылки, используя запрос на публикацию.К сожалению, у меня не было большого успеха в реализации:

let token = "xy",
  chat_id = "123"
let url = `https://api.telegram.org/bot${token}/sendPhoto?chat_id=${chat_id}`;

$("form").submit(function(e) {
  let formData = new FormData(this);
  e.preventDefault();
  $.ajax({
    url: url,
    type: 'POST',
    data: formData,
    success: function(r) {
      console.log(r);
    },
    error: (e) => {
      console.log("Error", e)
    }
    return false;
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form>
  <input id="fileInput" type="file" />
  <input type="submit" value="submit" />
</form>

Как я могу реализовать это в чистом JavaScript и работать?

Обратите внимание, что https://api.telegram.org/bot${token}/sendPhoto?chat_id=${chat_id}&photo=${link_to_photo} работает.

1 Ответ

0 голосов
/ 02 декабря 2018

Хотя это не очевидно из документации jQuery , вам нужно установить еще две опции ajax:

processData: false

processData (по умолчанию): true)
Тип: Boolean По умолчанию данные, передаваемые в параметр данных как объект (технически, что угодно, кроме строки), будут обрабатываться и преобразовываться в строку запроса, соответствующуютип содержимого по умолчанию "application / x-www-form-urlencoded".Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

FormData следует отправлять необработанным

contentType: false

contentType (по умолчанию: 'application / x-www-form-urlencoded; charset = UTF-8')
Тип: Boolean или String При отправке данных всервер, используйте этот тип контента.По умолчанию используется «application / x-www-form-urlencoded; charset = UTF-8», что подходит для большинства случаев.Если вы явно передаете тип содержимого в $ .ajax (), то он всегда отправляется на сервер (даже если данные не отправляются).Начиная с jQuery 1.6, вы можете передать false, чтобы указать jQuery не устанавливать заголовок типа контента.Примечание: спецификация W3C XMLHttpRequest требует, чтобы кодировка всегда была UTF-8;указание другой кодировки не заставит браузер изменить кодировку.Примечание. Для междоменных запросов установка типа содержимого, отличного от application / x-www-form-urlencoded, multipart / form-data или text / plain, заставит браузер отправлять предварительный запрос OPTIONS на сервер.

$.ajax({
  url: url,
  type: 'POST',
  data: formData,
  
  processData: false, // TO SEND DATA UNPROCESSED
  contentType: false, // TO OVERRIDE THE DEFAULT 
  
  success: function(r) {console.log(r);},
  error: (e) => {console.log("Error", e)}
//  return false;  <-- REMOVE THIS FROM HERE
});
...