Я работаю над формой (HTML) для внутреннего инструмента. Пользователи могут заполнить данные о проблеме и прикрепить скриншоты. Затем эта форма отправляется через ajax в PHPMailer для отправки. Вопрос со скриншотами. Из-за системных ограничений я не могу заставить пользователей загружать файлы на сервер.
В настоящее время я использую средство чтения файлов HTML5 для выбора файлов. Затем я конвертирую изображения больших двоичных объектов в base64 и отправляю их в PHPMailer для преобразования во вложения. Это на самом деле работает отлично. Тем не менее, я сталкиваюсь с проблемами размера файла. В частности, тестовое изображение 1000 x 1000 пикселей (402 КБ). Результирующая строка base64 имеет длину более миллиона символов, и запрос возвращается 413 (запрос слишком большой).
Я понимаю, что base64 не эффективный метод для передачи больших изображений, и я видел различные сообщения о получении / преобразовании больших двоичных изображений из базы данных. То, что я не смог найти, это информация о том, как получить локальный блоб изображения и преобразовать его в base64.
URL-адреса моего блоба изображения выглядят так:
блоб:http://example.com/18960927-e220-4417-93a4-edb608e5b8b3
Можно ли получить эти локальные данные изображения в PHP, а затем преобразовать их в base64?
Я не могу опубликовать большую часть источника, но, следующее даст вам представление о том, как я использую Filereader
window.onload=function(){
window.URL = window.URL || window.webkitURL;
var fileSelect = document.getElementById("fileSelect"),
fileElem = document.getElementById("fileElem"),
fileList = document.getElementById("fileList");
fileSelect.addEventListener("click", function (e) {
if (fileElem) {
fileElem.click();
}
e.preventDefault(); // prevent navigation to "#"}, false);
}
function handleFiles(files) {
if (!files.length) {
fileList.innerHTML = "<p>No files selected!</p>";
} else {
fileList.innerHTML = "";
var list = document.createElement("ul");
fileList.appendChild(list);
for (var i = 0; i < files.length; i++) {
if(files[i].size > 1000000) {
alert(files[i].name + ' is too big. Please resize it and try again.');
} else {
var li = document.createElement("li");
list.appendChild(li);
var img = document.createElement("img");
img.src = window.URL.createObjectURL(files[i]);
img.height = 60;
img.setAttribute("class", "shotzPrev");
img.onload = function() {
window.URL.revokeObjectURL(this.src);
}
li.appendChild(img);
var info = document.createElement("span");
info.innerHTML = files[i].name + "<br>" + files[i].size + " bytes";
li.appendChild(info);
}
}
}
}
Вы можете POST
File
Возражать php
fetch("/path/to/server", {
method: "POST"body: files[i]
})
.then(response => console.log(response.ok))
.catch(err => console.error(err));
Я думаю, что это ошибка nginx, пожалуйста, измените client_max_body_size значение в файле nginx.conf.
например :
# set client body size to 2M #
client_max_body_size 2M;
Конфигурация PHP (необязательно)
Ваша установка php также накладывает ограничения на размер загружаемого файла. Отредактируйте php.ini и установите следующие директивы.
;This sets the maximum amount of memory in bytes that a script is allowed to allocate
memory_limit = 32M
;The maximum size of an uploaded file.
upload_max_filesize = 2M
;Sets max size of post data allowed. This setting also affects file upload. To upload large files, this value must be larger than upload_max_filesize
post_max_size = 3M