предисловие
Я забыл, где я видел эту тему, я думаю, что это очень интересно, позвольте мне рассказать вам свой ответ и ход мыслей.
Прежде всего, нам нужно знать, что обычно существует два метода передачи изображений:base64иfileобъект.
изображение base64
рисунокbase64Кодирование должны были видеть все:
base64по сути является строкой, аGETЗапрашиваемые параметры находятся вurlвнутри, поэтому поместите изображение прямоbase64данные вurlвнутри, это может быть достигнутоGETПросьба загрузить фотографии.
inputИзображение, полученное полем ввода,fileпредмет, картинаfileповорот объектаbase64:
// img参数: file文件或者blob
const getBase64 = img => {
return new Promise((resolve,reject) => {
const reader = new FileReader();
reader.onload = e => {
resolve(e.target.result);
};
reader.onerror = e => reject(e);
reader.readAsDataURL(img);
})
}
Вот проблема,GETпросилurlДлина ограничена. Разные браузеры имеют разные ограничения длины. Самый длинный, вероятно,10kвокруг, по словамbase64принцип кодирования,base64Размер изображения на 1/3 больше исходного размера файла, так сказатьbase64Вы можете отправлять только очень маленькие картинки, большие картинкиbase64Слишком длинный будет усечен.
Но на самом деле это ограничение на длину задает браузер, а неGETСам запрос, то есть на стороне сервера,GETДлина запроса теоретически бесконечна, то есть можно отправлять изображения любого размера.
файловый объект
Давайте посмотрим на эту сцену:
<form action="http://localhost:8080/" method="get">
<input type="file" name="logo">
<input type="submit">
</form>
Выберите изображение, а затем отправьте форму, отправка может быть успешной, но интерфейс не может получить файл. просилurlстанетhttp://localhost:8080/?logo=xxx.png, но не будет нести данные изображения.
нормальная ситуация,fileДанные объекта помещаются вPOSTпросилbodyвнутри, и естьform-dataкодирование.
ТакGETли запросbodyтело? Ответ положительный.
GETиPOSTПринципиальной разницы нет, они простоHTTPДва метода запроса в протоколе отличаются только форматом сообщения (или спецификацией).
Коллеги, занимавшиеся низкоуровневой разработкой, могут быть знакомы с ним.HTTPзапрос, они получили что-то вроде этого:
Возьмите каштан, обычныйGETзапрос, они получают что-то вроде этого:
GET /test/?sex=man&name=zhangsan HTTP/1.1
Host: http://localhost:8080
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: Keep-Alive
POSTЗапрос выглядит так:
POST /add HTTP/1.1
Host: http://localhost:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
такой же,DELETE,PUT,PATCHЗапросы также являются такими сообщениями. Когда нижний уровень анализирует это сообщение, ему все равно, что это за запрос, поэтому мы говоримGETзапрос также может иметьbodyтело, также может передаватьform-dataданные.
Желающие могут взятьpostmanпопробуй и увидишьGETЗапрос на загрузку изображения, может ли интерфейс получить файл изображения:
конец
В итоге,GETЗапрос может отправить фотографии, ноGETиPOSTВы все равно должны соблюдать правила, если для этого есть закулисье, просто забейте его!