Как разместить файлы из HTML5 Drag-Drop в Rails 3 App & Paperclip? - PullRequest
18 голосов
/ 22 сентября 2010

Я пытаюсь получить html5-функциональность перетаскивания в приложении Rails 3 с Paperclip. Итак, в основном:

  1. Один или несколько файлов перетаскиваются на DIV
  2. Файлы помещаются в действие Rails (вместе или по одному за раз)
  3. Действие Rails сохраняет каждый файл как новое вложение в Paperclip

Прямо сейчас единственный способ получить эту работу - отправить запрос XMLHttpRequest с данными File и заставить мое действие Rails прочитать request.raw_post ... это нереализуемое решение, потому что мне нужно отправить дополнительный POST параметры и маркер подлинности.

Вот что у меня есть:

<!-- IN MY VIEW -->
<h2>Drag and drop upload</h2>

<div id="drop">
  <h2>Drop Files Here</h2>
</div>

<script type="text/javascript" charset="utf-8">
  var dropbox = document.getElementById("drop");  
  drop = function(evt) {   
    evt.stopPropagation();
    evt.preventDefault();
    var files = evt.dataTransfer.files;
    var count = files.length;
    if (count > 0) {
        // handleFiles(files);
      var url = '/images/raw';
      var request = new XMLHttpRequest();
      request.open("POST",  url, true); // open asynchronous post request
      request.send(files[0]);
    }
  }
  dragEnter = function(evt) {
    evt.stopPropagation();
    evt.preventDefault();
  }
  dragExit = function(evt) {
    evt.stopPropagation();
    evt.preventDefault();
  }
  dragOver = function(evt) {
    evt.stopPropagation();
    evt.preventDefault();
  }
  // init event handlers
  dropbox.addEventListener("dragenter", dragEnter, false);
  dropbox.addEventListener("dragexit", dragExit, false);
  dropbox.addEventListener("dragover", dragOver, false);
  dropbox.addEventListener("drop", drop, false);
</script>

И мое действие контроллера:

class ImagesController < ApplicationController

  # ... Normal REST actions 

  def raw
    name = "tmp_image.png"
    data = request.raw_post
    @file_content = File.open("#{Rails.root.to_s}/tmp/#{name}", "wb") do |f| 
      f.write(data)
    end
    @image = Image.new(:attachment => File.new("#{Rails.root.to_s}/tmp/#{name}"))
    @image.save
    File.unlink("#{Rails.root.to_s}/tmp/#{name}")
    render :text => 'success'    
  end
end

Итак, как правильно перетаскивать файлы POST в мое приложение с дополнительными параметрами?

(Если это поможет, у меня есть весь эксперимент в виде публичного репозитория GitHub здесь )

Ответы [ 2 ]

8 голосов
/ 20 марта 2011

Посмотрите на

https://github.com/blueimp/jQuery-File-Upload/wiki

и прокрутите вниз до Ruby (на Rails). Это, вероятно, именно то, что вы ищете, в том числе учебник о том, как использовать его с Rails 3 и paperclip. И из моего собственного опыта это работает как шарм.

И как прокомментировал Джуст: https://github.com/yortz/carrierwave_jquery_file_upload показывает хороший пример того, как объединить carrierwave с jquery_file_upload

0 голосов
/ 14 декабря 2010

Может быть, они могут помочь: https://github.com/valums/file-uploader и https://github.com/newbamboo/rack-raw-upload

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...