- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我添加了通过 Dropbox Chooser 将文件从 Dropbox 上传到我的网站的功能。一切工作正常,除了一件事 - 我不知道如何正确实现 Cancel
功能。它应该以这种方式工作 - 当您单击取消
时 - 相应的文件面板应该从 UI 中删除,并且从 Dropbox 上传应该停止。
当用户单击从 Dropbox 中选择
并选择文件并单击提交
时,我向 Rails 的方法 发起一个
。在此方法中,我通过 Ajax
请求add_file_via_dropboxPaperclip
gem 的帮助获得了 Dropbox 文件的 URL
,以便将其上传到 Amazon S3
服务器。
当用户单击取消
时,我想删除部分上传到S3
文件,该文件将存储(成功上传后)在content.attachment中
属性。但是当他点击取消
时 - 文件仍在上传(否则他不会看到取消
链接),我不知道如何立即删除它。
我的另一个想法是,我可以简单地将 cancelled
属性添加到 content
中,然后不显示任何此类属性 == 的 content
真
。但这种方法无法避免浪费 Amazon S3
空间,因此我应该每天运行一次后台任务来删除已取消
附件。我不想首先将它们保存在 S3
上。是否可以?我考虑过将 Controller 的操作 add_file_via_dropbox
移动到后台作业,这样我就可以在收到客户端的 cancel
ajax 请求后立即kill
它。我对这一切有点困惑。你会如何解决这个问题?谢谢。
product_form.html.erb
$.ajax({
// Cancel file uploading on client side via jqXHR.abort()
// It's quite useless because with 99% probability that request
// already was sent to Rails and is processing by appropriate action
beforeSend: function(jqXHR, options) {
tmpl.find('a').click(function(e) {
e.preventDefault();
jqXHR.abort();
$(this).parents('li').remove();
});
},
type: "POST",
dataType: "json",
url: "<%= add_file_via_dropbox_url %>",
data: { product_id: $("#fileupload").data("product_id"), file: dropbox_file },
})
// When Rails response is returned - update UI with "successful upload state"
.done(function(json_file) {
var done_tmpl = $(tmpl("template-download", json_file));
var li = $(".files_list").find('[data-uuid="' + json_file.uuid + '"]');
li.replaceWith(done_tmpl);
}
})
product_controller.rb
# This method is called by Ajax request
def add_file_via_dropbox
product = Product.find(params[:product_id])
# Each Product has_many Contents(files)
file = params[:file]
content = product.contents.build
content.attachment_remote_url = file[:url]
content.save
# Construct json response object for Ajax call
json_obj = []
json_obj << {name: content.attachment_file_name,
size: content.attachment_file_size,
url: content.attachment.url,
thumbnailUrl: content.attachment.url,
deleteUrl: "#{root_url}profile/products/delete_content/#{product.id}/#{content.id}",
deleteType: "DELETE",
uuid: file[:uuid]}
respond_to do |format|
format.json { render json: json_obj }
end
end
内容.rb
class Content
attr_reader :attachment_remote_url
has_attached_file :attachment, bucket: ENV['S3_BUCKET_NAME']
def attachment_remote_url=(url_value)
self.attachment = URI.parse(url_value)
end
end
稍后添加
我更详细地研究了 Paperclip 的工作原理:
1)当这行代码执行时
content.attachment_remote_url = file[:url]
此回形针代码从 paperclip/.../uri_adapter.rb
执行它从给定的 URL(在我的示例中为 Dropbox URL)下载文件并将其保存在本地(Rails 服务器中的临时文件中)
class UriAdapter < AbstractAdapter
def initialize(target)
@target = target
@content = download_content # <----
cache_current_values
@tempfile = copy_to_tempfile(@content)
end
...
def download_content
open(@target) # method from 'open-uri' library
end
2) 仅当我在此处保存模型时,此文件才会推送到 S3:
content.attachment_remote_url = file[:url]
content.save # <----
Paperclip save
方法将被调用:(paperclip/.../attachment.rb
)
def save
flush_deletes unless @options[:keep_old_files]
flush_writes # <-----
@dirty = false
true
end
然后flush_writes
然后将本地文件推送到S3(paperclip/.../s3.rb
)
def flush_writes
# omitted code
s3_object(style).write(file, write_options) # method from `aws-sdk` gem
# omitted code
end
因此,我将原来的问题缩小到这两个问题:
1) 当 open(@target)
已经在运行时,如何取消调用(文件正在下载到我的 Rails 服务器)
2) 当文件从 Rails 服务器上传到 S3 时,如何取消对 s3_object(style).write(file, write_options)
的调用?
最佳答案
如果在服务器端将文件处理到 S3 之前文件仍在上传到您的服务器,您将需要像之前一样中止连接。 IE。 How to cancel/abort jQuery AJAX request?
如果文件已上传到服务器并且正在上传到 S3:因为 ruby 不是基于异步的,所以您本质上必须让文件上传,但因为服务器现在正在上传它,所以您的客户端可以从技术上讲,请离开该页面。所以:当您的服务器收到文件时,我会传回一个唯一的 ID,如果用户仍然单击取消,则将 ID 重新输入并让您的服务器轮询或即 cron 删除要删除的文件。
关于jquery - 如何取消正在上传到 Amazon S3 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688787/
是否可以使用标准输入/标准输出在 bash 中压缩/解压缩字符串? 我试过了,但显然不支持它? hey=$(echo "hello world" | gzip -cf) echo $hey # ret
我的任务是让一个企业网站适用于 IE7,它必须“足够好”,因此我禁用了任何导致问题的花哨/非必要功能。 其中之一是正在使用的搜索栏,需要进行哪些搜索,我猜测幕后某个地方有某种 JavaScript 用
我有一个执行大量处理的小程序。您可以通过按回车键打印进度。 我实现它的方法是在主线程中完成处理,同时我有一个 pthread 不断循环 getchar() 以等待输入键。 问题是当我完成处理时。发生这
我完全理解 suspendCoroutine 与 suspendCancellableCoroutine 在我的示例中的工作方式。但我想知道为什么 println("I finished") (第 1
我是 QT 的新手。目前在我的项目中我实现了 QFileDialog . 在我的用例中:每当用户选择一个文本文件时,它都会执行 functionA .但是,我发现如果在文件对话框中单击取消,funct
我有代码,仅在用户选择“另存为”时运行。为此并获取我正在使用的文件的新名称 Application.GetSaveAsFilename功能。 我遇到的问题是类型不匹配,同时检查用户是否在他没有这样做时
我的 UILocalNotification 有问题。 我正在用我的方法安排通知。 - (void) sendNewNoteLocalReminder:(NSDate *)date alrt:(NS
祝你有美好的一天 我有一个网站,其中有很多“工具提示”。这些工具提示是在将鼠标悬停在文本的特定部分上时创建的。工具提示是一个 div block ,它显示在网站上所有其他内容的顶部,并且当光标从文本移
我遇到以下问题。每隔 2 秒,程序就会进入 if 语句。在这个 if 语句中,我想要一个计时器,它会在 15 秒后给我一条消息。计时器应延迟 1 秒运行。但是当我用计时器“等待”时,if 语句将再执行
基本上我有以下代码片段, (let [task (FutureTask. fn) thr (Thread. task)] (.start thr) ;;wait for signa
取消正在进行的 ASIHttpRequest 请求的正确位置在哪里?这就是我取消的方式,但是当我 时它继续崩溃在不让请求完成的情况下从一个 View Controller 转移到另一个 View Co
我在我的 winforms 应用程序中使用 BackgroundWorker 来执行另一个类中发生的长时间运行的任务(执行数据库操作)。由于所有工作都是在另一个类中完成的,因此取消并不那么简单。我在另
我正在使用 OneSignal 向我的用户显示通知。通知工作正常,但我注意到,如果我在通知栏中“滑动”取消通知,则通知将永远保留,这是一张显示应用程序图标上的通知的图像,我想在应用程序已打开: 我看到
正在运行的 AsyncTask 的 .cancel(boolean) 方法如何工作?这是文档: Attempts to cancel execution of this task. This atte
我注意到,当我激活约束时,我会立即在该行代码处收到一条警告,指出不能同时满足约束。 我假设布局是在“UI 更新周期”之类的稍后时间点计算的,而不是每次约束都被(取消)激活。因此,在(取消)激活约束的代
这是我创建线程的方式: readFromWebThread = [[NSThread alloc] initWithTarget:self selector:@selector(loadThread:
我目前正在尝试取消与我的数据模型中的对象关联的特定 UILocalNotifications。为此,每个数据对象都有一个唯一标识符,即 NSUUID。 创建 UILocalNotification:
当我提交并单击“确定”时,它会继续,但当我按“取消”时,它仍然会提交。我尝试使用此代码,但提交和取消按钮仍然执行相同的操作。 model.saveForm = function() { var
我有一个警报弹出窗口,当发生特定操作时会出现该弹出窗口。 5 秒后,使用 setTimeout() 隐藏警报弹出窗口。 我遇到的问题是,如果我多次触发弹出窗口,有时后续的弹出窗口会出现但立即消失。我相
我有一些 javascipt (jQuery),其中单击按钮时会淡入 #myDiv,然后使用超时函数在 5 秒后再次淡出。它工作正常,但如果用户在超时内的 fadeOut 函数运行之前再次单击该按钮,
我是一名优秀的程序员,十分优秀!