У меня есть страница, где пользователь может загрузить изображение в том формате, который он запрашивает, запрос отправляется в сценарий PHP, который создает изображение, и ... я хочу предоставить его пользователю. Это код JQUERY, полученный здесь в StackOverflow
$('[name ="download_img_ajax"]').click(function(e){
e.preventDefault()
var element = this
var formdata = new FormData(element.closest(".form_downIMG"))
formdata.append('download_img_ajax','true')
$(this).next("span.down_response").html('Preparazione file in corso...'),
$('.emailadr').hide(),
$.ajax({
type: 'POST',
url: '$target_post',
data: formdata,
cache: false,
contentType: false,
processData: false,
success: function(tornato) {
const blob = new Blob([tornato], {type: 'image/jpeg'});
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = downloadUrl;
a.download = "file.jpg";
document.body.appendChild(a);
a.click();
},
})
})
Сценарий PHP создает файл как файл tmp ($ img), но я не понимаю, как вернуть его как правильный AJAX ответ.
echo fread($img,filesize($img_path));
не работает (файл не распознается как файл JPG), даже если размер правильный.
В обычном режиме Форма я возвращаю файл следующим образом:
header('Content-Transfer-Encoding: binary'); // For Gecko browsers mainly
header('Accept-Ranges: bytes'); // For download resume
header('Content-Length: ' . filesize($img_path)); // File size
header('Content-Encoding: none');
header('Content-Type: image/jpeg'); // Change this mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $imgID); // Make the browser display the Save As dialog
readfile($img_path);
fclose($img);
PS: В JQ я использую next, closest, et c. потому что у меня много форм в одной и той же динамически сгенерированной PHP.
Я буду использовать этот тип загрузки только для файла ~ 700 КБ, оставляя больший файл в старом методе формы отправки с target = "_blank" и файл чтения в PHP. Это безопасно?
Если я хочу справиться и с ошибкой (например, скрипт PHP не может обработать файл), как я могу справиться с этим?
Спасибо.