gpt4 book ai didi

ruby-on-rails - 带有Rails表单的上载器

转载 作者:行者123 更新时间:2023-12-04 22:57:47 24 4
gpt4 key购买 nike

我最近已将Fine Uploader安装到我们的Rails应用程序中。我已经阅读了文档并对其进行了一些试验,但是我似乎并不了解该东西的实际工作原理,因此,在实现它方面存在很多问题。

我做了什么:
安装了它(两种方式,一种是“经典”方式,另一种是使用fineuploader gem,这似乎也是如此)。

创建了一个包含此文件的咖啡文件。

$ ->
uploader = new (qq.FineUploader)(
debug: true
element: document.getElementById('fine-uploader')
request: endpoint: '/uploads')
template: 'test-template'


这会创建一个“上传文件”按钮(这当然是行不通的,因为在服务器站点上没有任何配置可以处理该按钮),但是我想在简单形式的输入字段中使用此按钮。

另外,模板不起作用,我不太了解原因。

不幸的是,文档缺乏对Rails的帮助。

我愿意将此库更改为其他库,只要它包含我需要的功能即可:


暂停并恢复下载
文件分块(万一发生故障,不会迫使用户重新开始)
进度条(不重要)

最佳答案

我已经设法使其工作了,并且我对它的工作方式有一些了解,因此我将分享这些知识。但我要特别指出的是,我已经自己弄清楚了,所以我提供的内容可能存在缺陷。利用您的知识和经验,如果您认为可以做得更好,那可能是对的。

首先,使用npm下载该库。我已经找到了两个宝石,但是不要使用它们。在我撰写本文时,那些宝石已经过时了,将无法使用。 Github链接:

github.com/mezis/fineuploader-rails
github.com/zakgrant/fine-uploader-rails

如果您恰巧下载了这些文件,则必须重新安装库。

之后,您将创建javascript。我已经创建了一个名为“ fine-uploader.coffee”的文件,并在其中放置了以下内容:

$ ->
uploader = new (qq.FineUploader)(
element: document.getElementById('fine-uploader')
request:
endpoint: '/upload'
params:
authenticity_token: $('#fine-uploader').data('authenticity-token')
template: 'template-name'
chunking:
enabled: true
mandatory: true
success:
endpoint: "/upload/finish"
)


我不会描述什么是什么,因为所有这些都可以在文档中找到,相反,我将专注于对我们重要的事情。
在“请求”中,您有一个端点,在这种情况下,我们需要像这样将其添加到路由中。

post 'upload', to: 'uploads#create'


然后,我们将需要创建我们的控制器。如您所见,我已经创建了用于处理上载的专用控制器,建议您这样做。

在上载控制器中,我们执行以下操作:

def create
file = params[:qqfile]

#code that does whatever you need

respond_to do |format|
format.json {
render json: { success: true }
}
end
end


在控制器中,您将具有一些参数(可以在文档中检查所有参数),但是对您而言重要的参数是qqfile。这将是已发布的文件。您可以用它做任何您想做的事。我使用的是载波来保存和处理它,我想这不需要进一步的描述(因为您可以在载波文档中找到它,也可以使用其他文件,例如重新归档)。

您还必须添加带有令牌的参数,您可以在javascript文件的第7行中看到它。我建议阅读有关CSRF令牌的信息。

重要的是,如果您(像我一样)选择了分块选项,则它将不会是整个文件,而不会是整个文件的一部分。您可以找到有关如何处理分区文件的较大教程,但是需要注意的是将以参数形式发送的qquuid。该ID标识正在上传的文件,您将需要它来确定上传的文件属于哪个文件,因此您不会混淆两个文件。每个部分都由单独的发布请求发送,因此我建议将qquuid之类的列添加到处理文件的模型中。例如:

Attachment.new(params[:qqfile], params[:qquuid])


保存所有文件后,可以将它们组合在一起(检查ruby File类以了解操作方法)。

Attachment.where(qquuid: params[:qquuid]).combine_them_all


上面的行可以放在最后的create动作中,条件是这是最后一部分(有些参数的总零件号和当前零件的索引号可用于确定),或在“完成”操作中使用

chunking:
success:
endpoint: "/upload/finish"


您将必须创建一条路线(如上所示的相同方法)和操作。发送最后一部分后,将触发此操作。如果文件太小而无法分割,除非您将强制性设置为“ true”,否则不会触发该文件。

最后一件事是json响应。这部分很简单,好的上载器希望您响应(使用json),您收到文件后一切都会顺利进行。如果无法解决问题,它将假定出了点问题(您可以在上载器文档中阅读有关预期json的更多信息)。重要的是万一发生故障,它将尝试再次发送失败的零件(如果autoRetry设置为true)。

现在,对于视图(haml):

#fine-uploader{"data- authenticity-token" => form_authenticity_token}
%script#template-name
Here goes the template


您可以在文档中阅读有关模板的更多信息,但重要的是,请勿为此使用rails形式(或简单形式)。有一种方法可以将表单与上载器连接起来,但是我无法使其正常运行,也不需要使用表单,但是如果需要的话,可以使用生成的令牌创建隐藏字段识别它,并使用它而不是qquuid来识别文件。您可以以相同的方式在params部分中提供它,您已经提供了CSRF令牌,并在上载控制器的“ create”操作中使用它。

就是这样。希望对您有所帮助。

编辑:有一个由用户Panczo制作的示例应用程序发布 in the comments

关于ruby-on-rails - 带有Rails表单的上载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37434702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com