首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails PaperClip拖放多个文件

Rails PaperClip拖放多个文件
EN

Stack Overflow用户
提问于 2013-03-29 12:50:13
回答 1查看 2.7K关注 0票数 3

我使用PaperClip和Rails上传文件,它工作得很好,但是它想要执行一个拖放文件处理,允许上传多个文件。而且每个文件都不应该超过一定的大小。

编辑:

到目前为止,我已经创建了javascript部分。但是,我无法理解如何创建控制器部分。

代码语言:javascript
复制
var $dropArea = $(".drop-area");

$dropArea.bind({
    dragover: function () {
        $(this).addClass('hover');
        return false;
    },
    dragend: function () {
        $(this).removeClass('hover');
        return false;
    },
    drop: function (e) {
        e = e || window.event;
        e.preventDefault();

        e = e.originalEvent || e;

        var files = (e.files || e.dataTransfer.files);

        var $img = $('<img src="" class="uploadPic" title="" alt="" />');
        for (var i = 0; i < files.length; i++) {
            (function (i) {
                var reader = new FileReader();
                reader.onload = function (event) {
                    var newImg = $img.clone().attr({
                        src: event.target.result,
                        title: (files[i].name),
                        alt: (files[i].name)
                    });

                    $("body").append(newImg);
                };
                reader.readAsDataURL(files[i]);

                var xhr = new XMLHttpRequest();

                var fd = new FormData();

                fd.append(files[i].name, files[i]);

                xhr.open("POST", 'url', true);
                xhr.send(fd);
            })(i);
        }

        return false;
    }
});

这是基本的控制器部分: def create @image = Image.new(params:image)

代码语言:javascript
复制
    if @image.save
        respond_to do |format|
            format.html { redirect_to action: 'index', :notice => 'Image saved'}
            format.js   { redirect_to action: 'index', :notice => 'Image saved'}
            format.xml  { redirect_to action: 'index', :notice => 'Image saved'}
        end
    else
        flash[:notice] = "Error, Please try again"
        redirect_to action: 'new'
    end
end

我该怎么做?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-03 19:29:02

经过一番研究,我发现这样做是很容易的:

代码语言:javascript
复制
var dropArea = document.getElementById("droparea"),
    viewArea = document.getElementById("previewarea");

dropArea.addEventListener("drop", function(evt){
    evt.preventDefault();
    evt.stopPropagation();

    previewFiles(evt.dataTransfer.files);
    return false;
}, false);

function previewFiles(files){
    for (i=0; i < files.length; i++){
        if (typeof FileReader != "undefined"){
            var img = document.createElement("img");
            viewArea.appendChild(img);

            var reader = new FileReader();
            reader.onload = (function(theImg){
                return function(evt){
                    theImg.src = evt.target.result;
                }
            }(img));
            reader.readAsDataURL(files[i]);
        }
    }

    uploadFiles(files);
}

function uploadFiles(files){
    var fd = FormData();
    var position = 0;
    var max = files.length;
    if (typeof fd != "undefined"){
        function queue(){
            if (max >= 1 && position <= max - 1){
                fd.append("file", files[position]);
                upload();
            }
        }

        function upload(){
            $.ajax({
              url: '/boxes/hiThere',
              data: fd,
              processData: false,
              contentType: false,
              type: 'POST',
              success: function(data){
                position = position + 1;
                queue();
              }
            });
        }
        queue();
    }
}

dropArea.addEventListener("dragenter", function(evt){
    if (evt){
        this.className = "drag-enter";
    }
    endFn(evt);
}, false);

dropArea.addEventListener("dragleave", function(evt){
    this.className = "";
    endFn(evt);
}, false);

dropArea.addEventListener("dragover", function(evt){
    endFn(evt);
    evt.dataTransfer.dropEffect = 'move';

    return false;
}, false);

function endFn(evt){
    evt.preventDefault();
    evt.stopPropagation();
}

然后简单地在rails中添加常规的保存,如下所示:

代码语言:javascript
复制
def hiThere
  box = Box.new(params[:box])
  box.user_id = current_user.id
  box.file_path = params[:file]

  if box.save!
    set_flash "File saved sucessfully"
  else
    set_flash "Error, please try again"
  end

  respond_to do |format|
    format.js { redirect_to action: :index, :notice => "Done" }
  end
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15703594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档