Как автоматически показывать эскизы загрузки изображений без отправки в рельсы? - PullRequest
0 голосов
/ 23 июля 2011

У меня есть форма с несколькими входами file_field (для изображений), которые обрабатываются Paperclip.

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

Я смог отправить всю форму через ajax, используя гем remotipart ... но я не уверен, как достичь своей цели.

Кто-нибудь может помочь? Пожалуйста, дайте мне знать, если нужен код или более подробное объяснение. Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 июля 2011

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

0 голосов
/ 23 июля 2011

Я бы решил эту проблему следующим образом.

Если вам нужно загрузить несколько файлов через XHR, используйте http://github.com/valums/file-uploader. Это отличный плагин, который подойдет вашим потребностям.

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

Допустим, у вас есть модель с именем Photo.К нему прилагается: фотография.

class UploadsController < ApplicationController
  def upload_photo
    # In order to get contents of the POST request with the photo,
    # you need to read contents of request
    ajax_upload = params[:file].is_a(String)
    file_name = ajax_upload ? params[:file] : params[:file].original_filename
    extension = file_name.split('.').last

    # We have to create a temp file which is going to be used by Paperclip for
    # its upload
    tmp_file = "#{Rails.root}/tmp/file.#{extension}"
    file_id = 0

    # Check if file with the name exists and generate unique path
    while File.exists?(tmp_file) do
      tmp_file_path = "#{Rails.root}/tmp/file#{file_id}.#{extension}"
      id += 1
    end

    # Let's write the file from post request to unique location
    File.open(tmp_file_path, 'wb') do |f|
      if ajax_upload
        f.write request.body.read
      else
        f.write params[:file].read
      end
    end

    # Now that file is saved in temp location, we can use Paperclip to mimic one file
    # upload
    @photo = Photo.new :photo => File.open(tmp_file_path)

    # We'll return javascript to say that the file is uploaded and put its thumbnail in
    # HTML or whatever else you wanted to do with it
    respond_to do |format|
      if @photo.save
        format.js
      else
       format.js { render :json => { :errors => @photo.errors } }
      end
    end
  end
end

Вот как вы можете загружать несколько файлов AJAX в Rails с помощью Paperclip.

0 голосов
/ 23 июля 2011

Вы не можете сделать это волшебным образом, вы должны использовать ответ Шанисона.Если вы используете ajax, вы можете заставить все выглядеть плавно и плавно, но в действительности то, что в итоге произойдет, - это то, что описал Шанисон

...