@gracer

Как реализовать drag&drop заливку изображений без ajax?

Приветствую!

Хотелось бы реализовать такую логику загрузки изображений:
0) На странице есть обычная форма с обычными полями.
1) Перетаскиваем в браузер некоторое кол-во изображений.
2) В определённой области на странице появляются превьюшки этих изображений.
3) Жмём обычную submit кнопку и отправляем всю форму как обычно(с полями и изображениями).

Реализовано всё, кроме 3 пункта. Думал, что его можно реализовать, создавая для каждого изображения по input типа file и в этот input как-то сунуть изображение из event.dataTransfer.files, но так и не понял как это сделать.

Как примерно будут реализовываться 1 и 2 пункты(черновой грубый вариант):
document.ondrop = function(event){
    var files = event.dataTransfer.files,
        upZone = $("#multiUpload"),
        i, img, div;

    event.preventDefault();

    for(i = files.length-1; i >= 0; i--){
        img = new Image();
        img.src = URL.createObjectURL(files[i]);
        div = $('<div class="image hide">\
                <div><img src="'+URL.createObjectURL(files[i])+'"></div>\
                <div class="image-title">'+files[i].name+'</div>\
                <div class="close">x</div>\
                </div>');
        upZone.append(div);
        div.fadeIn();
    }
};


В общем у меня 2 вопроса:
1) Можно ли всё-таки в input type=file сунуть файл из event.dataTransfer.files, чтобы он потом отправился с формой?
2) Может я слишком загоняюсь и есть другие способы отправить файлы из event.dataTransfer.files вместе с формой?

Заранее благодарю за ответы!
  • Вопрос задан
  • 475 просмотров
Решения вопроса 1
Ответ на первый вопрос: нет, в input type=file запихнуть данные не получится.

Ответ на второй вопрос: Копай в сторону кодирования изображений в Base64.

Я бы сделал так:

При добавлении изображения на форму создаётся скрытый input type="text" hidden
в value которого записывается base64 строка вычисленная из изображения.

На сервере декодируем наши Base64 строки и записываем их в файлы.

Вуаля!

Библиотеки для работы с Base64 думаю не составит труда найти.

При передаче в таком виде размер Base64 строки будет примерно на 33% больше размера файла изображения.

А чем AJAX не устраивает? Им же можно бинарные данные отправлять.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
phil_b
@phil_b
Может я слишком загоняюсь и есть другие способы отправить файлы из event.dataTransfer.files вместе с формой?

не упустите из виду так же такой api как FormData
Ответ написан
Комментировать
@tj57
https://www.html5rocks.com/en/tutorials/file/dndfi...

есть пример - второй сверху
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы