Как вы загружаете одно изображение с Dropzone.js?

Dropzone.js, кажется, загружает изображения в виде данных из нескольких частей. Как получить загрузку изображений таким же образом, как загрузка изображений будет работать с cURL или загрузка двоичных изображений с Postman?

Я получаю предварительно подписанный URL для S3 с сервера. Предварительно подписанный URL позволяет загружать изображения, но не поля формы:

    var myDropzone = new Dropzone("#photo-dropzone");
    myDropzone.options.autoProcessQueue = false;
    myDropzone.options.autoDiscover = false;
    myDropzone.options.method = "PUT";

    myDropzone.on("addedfile", function ( file) {
        console.log("Photo dropped: " + file.name );
        console.log("Do presign URL: " + doPresignUrl);
        $.post( doPresignUrl, { photoName: file.name, description: "Image of something"  })
            .done(function( data ) {
                myDropzone.options.url = data.url
                console.log(data.url);
                myDropzone.processQueue();
        });
    });

Если я использую возвращенный URL с Postman и устанавливаю тело в двоичный файл и прикрепляю изображение, тогда загрузка работает нормально. Однако, если библиотека Dropzone использует тот же URL для загрузки изображения в S3, я получаю 403, потому что S3 не ожидает полей формы.

Обновить:

Альтернатива Ajax работает, как показано ниже, с URL-адресом со знаком S3, но Dropzone.js, похоже, не желает помещать необработанные данные изображения в тело сообщения PUT.

            $.ajax( {
                    url: data.url,
                    type: 'PUT',
                    data: file,
                    processData: false,
                    contentType: false,
                    headers: {'Content-Type': 'multipart/form-data'},
                    success: function(){
                        console.log( "File was uploaded" );
                    }
                });

2 ответа

Установите maxFiles на 1.

  Dropzone.autoDiscover = false;
        dzAllocationFiles = new Dropzone("div#file-container", {
            url: "api.php?do=uploadFiles"
            , autoDiscover: false
                , maxFiles: 1
                , autoQueue: true
            , addRemoveLinks: true
            , acceptedFiles: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        });

        dzAllocationFiles.on("success", function (file, response) {
    // Success Operations
        });

        dzAllocationFiles.on("maxfilesexceeded", function (file, response) {
            allocationFileNames = [];
            this.removeAllFiles();
            this.addFile(file);
        });

Добавьте ниже параметры, затем работайте.

myDropzone.options.sending = function(file, xhr) {
  var _send = xhr.send;
  xhr.send = function() {
    _send.call(xhr, file);
  }
}
Другие вопросы по тегам