2016-12-19 14 views
0

У моего сайта есть функция, позволяющая пользователям создавать сообщения (например, Facebook). У меня есть форма с полем ввода «Сообщение» и кнопка, которая позволяет пользователям загружать изображения.Отправка данных после загрузки изображения

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

Проблема заключается в том, что если пользователь отменяет загрузку изображения на полпути, запись базы данных будет существовать (поскольку данные были отправлены до загрузки изображения), но загруженных изображений не будет.

Итак, мое решение состоит в том, чтобы сначала загрузить изображения и отправить данные после. Проблема в том, что я не уверен, как я могу привязать изображения к данным в записи базы данных.

Должен ли я загрузить все изображения в /tmp, а затем переместить файлы в постоянной директории, как /var/www/html/website/public/img/uploads/<upload_id> где upload_id является в id в записи базы данных?

Что делать, если пользователь загружает изображение, но закрывает вкладку наполовину. Тогда будет изображение в /tmp, которое останется там навсегда, если только каталог не будет очищен. Как я смогу его очистить?

Это лучший способ сделать это или есть лучшие способы?

Я использую Laravel 5.3 и Dropzone.js.

Спасибо.

ответ

0

Поскольку вы используете Dropzone.js, который позволяет файлы, которые будут загружены с помощью AJAX, вы можете сделать это следующим образом:

1) Отправить файл на внутренний сервер с помощью Dropzone.js (AJAX).

2) Поскольку вы используете Laravel, каждый файл, который вы получите, будет экземпляром UploadedFile, вы можете использовать этот класс, чтобы получить доступ к исходному имени файла загруженного, размер, MimeType и т.д.

3) В модель изображения в вашей базе данных (создайте это, если это еще не сделано), создайте новую запись для этого изображения и при необходимости сохраните указанные выше поля, а также путь, в котором вы будете хранить изображение. Вы можете использовать этот путь, хранящийся в строке таблицы, чтобы получить доступ к изображению позже.

4) Получите «идентификатор» недавно вставленной строки в таблице изображений и передайте ее обратно в интерфейс, где вы можете получить его, используя обработчик событий «success» для плагина Dropzone.

5) Добавьте этот вновь вставленный «id» в качестве скрытого элемента ввода в вашей форме.

6) Когда вы отправляете форму, вы получите идентификаторы изображений, связанные с вашим сообщением, и вы можете сохранить их, используя отношения базы данных по вашему выбору.

7) Да, вам нужна дополнительная проверка изображений, которые были загружены и введены в таблицу изображений, но те, чьи сообщения не были созданы. Вы можете создать команду CLIS Artisan для нее и назначить ее как Cron Job.

0

Я думаю, вы должны отправить свою форму с помощью AJAX. Это решение было полезно для меня.

  1. Сделать, срок или другой элемент с событием «OnClick» вместо кнопки, так как нажатие кнопки подтвердит форму автоматически, даже если тип кнопки не является «представить».

  2. Написать функцию АЯКС так:

    function newsFormSubmit(item_id){ 
    
         var formData = new FormData($('.news-form')[0]); 
    
         formData.append("item_id", item_id); 
    
         $.ajax({ 
         type: 'POST', 
         url: config.routes[0].savenews, 
         data: formData, 
         processData: false, 
         contentType: false, 
         success: function (data) { 
          if (data.error) 
          { 
           alert(data.error); 
           return false; 
          } else if (data) 
          { 
           $('#news-card-' + item_id).html(data); 
          } 
         } 
        }); 
    } 
    
  3. Включите эту функцию на OnClick событие.

+0

Пожалуйста, перечитайте мой вопрос. Я не ищу такого решения. – user7315267

+0

Хорошо, если вы не хотите менять решение, вы должны сделать предварительный просмотр изображений без сохранения. Я думаю, этот пост будет полезен - http://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded. С предварительным просмотром. Если пользователь закрывает форму, изображение не будет храниться в БД и на диске. И если пользователь подтвердит данные формы - вы должны загрузить изображение и подтвердить форму так, как я написал ниже. –