如何在不使用图像 url 的情况下将现有缩略图数据从 Rails 发送到 Dropzone.js

How to send existing thumbnails data from Rails to Dropzone.js without using image's url

我是 Rails 的新手,在不使用图像 url 的情况下将现有缩略图从 Rails 发送到 Dropzone.js 时遇到问题。缩略图为 jpeg 格式,在 public 目录中不可用,因为它们位于服务器上 Rails 项目之外。

到目前为止,我可以将文件上传到服务器并进行处理。我发现 Rails 能够传递 send_file 或 send_data 形式的信息。我注意到 Dropzone.js 显示格式为

的上传缩略图
<img data-dz-thumbnail alt="..." src="data:image/png;base64...">

这是我的 Dropzone.js 初始化部分:

Dropzone.autoDiscover = false;
var dzupload = jQuery("#dZUpload"), attachments_path = $('#project_attachments_path').val();
dzupload.dropzone({
  url: "/project/upload_attachment",
  type: "POST",
  addRemoveLinks: false,
  init: function() {
    var myDropzone = this;
    jQuery.ajax({
      url: '/project/get_attachments',
      type: "POST",
      data: {id: "#{@project.id}"},
      success: function(data) {
        jQuery.each(data.attachments, function(index,val) {
          jQuery.ajax({
            url: '/project/send_thumbnail',
            type: "POST",
            data: {id: "#{@project.id}", file: val},
            success: function(file) {
              var mockFile = {
                filename: val.filename,
                name: val.original_filename,
                size: val.size,
                type: val.content_type,
                status: Dropzone.ADDED
              };
              myDropzone.emit("addedfile", mockFile);
              // This is not correct way
              myDropzone.emit("thumbnail", mockFile, file);
              myDropzone.emit("complete", mockFile);
            }
          });
        });
      }
    });
  }...
});

这是我的 Rails 部分 send_file 版本:

def send_thumbnail
  s = service_factory.new_project_service
  url = s.get_project_url(params[:id])
  send_file("#{url}/dropzone_#{params[:file][:filename]}",
    :type => params[:file][:content_type],
    :filename => params[:file][:original_filename],
    :disposition => 'inline',
    :x_sendfile => true)
end

谁能帮我解决这个问题?

我已经解决了这个问题!这个想法是通过 url 地址检索每个附件。收到项目附件文件名后,将设置操作路径、项目 ID 和附件以创建一个 URL 地址,从中加载缩略图。路由设置为routes.rb 文件。比如路径和action=/project/send_thumbnail,项目ID=1,文件名=123就会执行"#{project_send_thumbnail}/{#@project.id}/"+文件。

所以它就像下面这样。

Dropzone.js

Dropzone.autoDiscover = false;
var dzupload = jQuery("#dZUpload"), attachments_path = $('#project_attachments_path').val();
dzupload.dropzone({
  url: "/project/upload_attachment",
  type: "POST",
  addRemoveLinks: false,
  init: function() {
    var myDropzone = this;
    // Fetch project's attacment
    jQuery.ajax({
      url: '/project/get_attachments',
      type: "POST",
      data: {id: "#{@project.id}"},
      success: function(data) {
        jQuery.each(data.attachments, function(index,file) {
           var mockFile = {
             filename: val.filename,
             name: val.original_filename,
             size: val.size,
             type: val.content_type,
             status: Dropzone.ADDED
           };
           myDropzone.emit("addedfile", mockFile);
           // 
           myDropzone.emit("thumbnail", mockFile, "#{project_send_thumbnail_path}/#{@project.id}/"+file);
           myDropzone.emit("complete", mockFile);
        });
      }
    });
  }...
});

routes.rb

match 'project/send_thumbnail/:project_id/:file' => 'project#send_thumbnail', :as => project_send_thumbnail

project/send_thumbnail.rb

def send_thumbnail
  s = service_factory.new_project_service
  file = s.get_file(params[:project_id], params[:file])
  send_file(file[:filename],
    :type => file[:content_type],
    :filename => file[:original_filename],
    :disposition => 'inline',
    :x_sendfile => true)
end