JPG (двоичные данные) скачать как AJAX ответ - PullRequest
0 голосов
/ 01 мая 2020

У меня есть страница, где пользователь может загрузить изображение в том формате, который он запрашивает, запрос отправляется в сценарий 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 не может обработать файл), как я могу справиться с этим?

Спасибо.

1 Ответ

0 голосов
/ 01 мая 2020

Решено с помощью FileSaver. js (https://github.com/eligrey/FileSaver.js)

                        var xhr = new XMLHttpRequest()
                            xhr.open('POST', '$target_post')
                            xhr.responseType = 'blob'
                            xhr.onload = function() {
                              saveAs(xhr.response, 'immagine.jpg');
                            }
                            xhr.send(formdata)

PHP echo fread($img,filesize($img_path));

...