[英]Rails 3 and plupload - how can I do redirect after upload?
当我通过以下代码通过plupload
上传文件时,因此在Firebug控制台中,我看到消息POST / uploads 200 OK 8192ms 。 文字颜色为红色。 当我看一下终端输出时, 在7653ms内有Completed 200 OK 。
var uploader = new plupload.Uploader({
runtimes: 'gears,html5,flash,silverlight,browserplus',
browse_button: 'pickfiles',
autostart : true,
max_file_size: '10mb',
url: '/uploads',
resize: { width: 320, height: 240, quality: 90 },
flash_swf_url: '/Scripts/pl/plupload.flash.swf',
silverlight_xap_url: '/Scripts/pl/plupload.silverlight.xap',
filters: [
{ title: "Image files", extensions: "jpg,gif,png" },
{ title: "Zip files", extensions: "zip" }
]
});
uploader.bind('Init', function (up, params) {
$('#filelist')[0].innerHTML = "<div>Current runtime: " + params.runtime + "</div>";
});
uploader.bind('Error', function (up, err) {
$('#filelist').append("<div>Error: " + err.code +
", Message: " + err.message +
(err.file ? ", File: " + err.file.name : "") +
"</div>"
);
});
uploader.bind('FilesAdded', function (up, files) {
for (var i in files) {
$('#filelist')[0].innerHTML += '<div id="' + files[i].id + '">' + files[i].name + ' (' + plupload.formatSize(files[i].size) + ') <b></b></div>';
}
//uploader.start();
});
$('#uploadfiles').click(function (e) {
uploader.start();
e.preventDefault();
});
uploader.bind('UploadProgress', function (up, file) {
$('#' + file.id)[0].getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
});
uploader.init();
在Uploads控制器中,操作创建如下:
def create
@upload = Upload.new(:upload => params[:file])
if @upload.save
head 200
#redirect_to '/users'
else
render :action => "new"
end
end
如何重定向到任何页面? 可以看到,在完成向页面用户的上传后,我尝试进行重定向,但是很遗憾,没有任何反应。 如果在创建动作中是head 200
,那么也什么也没发生。
任何人都可以帮助我,完成上传后如何重定向到其他页面? 我试图在Google上进行搜索,但找不到任何方法...
我想问你-为什么在上传文件后,总是在Firebug控制台中显示POST / uploads 200 OK,而没有任何日志消息?
我可以简单地使用window.location javascript函数来做到这一点。 Plupload有一个uploadcomplete事件,该事件在所有文件上传完成时生成。 上传单个文件后,将生成FileUploaded事件。 因此,如果您希望上传多个文件,则uploadcomplete事件将很有帮助。上传者的想法是从此处获取的,并添加了upload complete事件。 这是我的上传者。
<script type="text/javascript">
$(function(){
var uploader = new plupload.Uploader({
runtimes : "html5",
browse_button : 'pickfiles',
max_file_size : '100mb',
url : "/documents",
multipart: true,
multipart_params: {
"authenticity_token" : '<%= form_authenticity_token %>'
}
});
uploader.bind('FilesAdded', function(up, files) {
$.each(files, function(i, file) {
$('#filelist').append(
'<div id="' + file.id + '">' +
'File: ' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b>'
);
});
});
uploader.bind('UploadProgress', function(up, file) {
$('#' + file.id + " b").html(file.percent + "%");
});
uploader.bind('UploadComplete', function(up, files) {
window.location = '/documents';
});
$('#uploadfiles').click(function(e) {
uploader.start();
e.preventDefault();
});
uploader.init();
});
</script>
上传完成后,上传者将重定向以列出所有上传的文档。
两种选择:
1)Plupload有一个FileUploaded
回调,您可以使用:
uploader.bind('FileUploaded', function(up, file, info) {
// Redirect after successful upload
window.location = 'http://mysite.com/users';
});
2)您也可以尝试通过将以下代码放在ApplicationController
让Rails进行重定向:
# Allows redirecting for AJAX calls as well as normal calls
def redirect_to(options = {}, response_status = {})
if request.xhr?
render(:update) {|page| page.redirect_to(options)}
else
super(options, response_status)
end
end
我知道这有点老了,但我想改善回应。 根据@gonchuki所说的,我是这样做的:
uploader.bind('FileUploaded', function(up, file, info) {
window.location = info.response;
});
在我的控制器中,我只用简单的文本呈现url:
def create
# do stuff here
render :text => object_path(id: object)
end
希望也能提供帮助:)
您不能以这种方式进行重定向,因为使用任何上载运行时来上载文件都是间接操作 。 HTML5使用XHR,HTML4使用代理iframe,而flash / silverlight使用其内置的字节流API执行上传。
如果您一次仅上传一个文件,则唯一的选择是使用FileUploaded
事件。 第三个参数由所有运行时的服务器响应填充。 您实际上会像这样使用它(来自iWasRobbed的编辑copypasta):
uploader.bind('FileUploaded', function(up, file, info) {
// Redirect after successful upload
window.location = info.response;
});
由于plupload只能在几种不同的运行时上实现标准化,因此响应将始终为纯文本,因此您的重定向URL必须位于响应的正文中。 如果您需要更复杂的响应,则始终可以发送序列化的JSON并在客户端进行解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.