ruby on rails 多图上传
一、首先说一下需要使用的插件以及gem包。
1.paperclip(gem,用于后台文件处理,是一个很强大的工具)
2.swfupload(js/swf插件,用于前端页面的文件选择与提交上传,自带进度条。)
二、运行环境
1.ruby 1.9.3-p194
2.rails 3.2
三、准备工作。
首先在项目中安装用于处理上传文件的包,或者工具。(当然这个也可以自己手写。)我这里使用的是paperclip,可以在rubygems.org这里搜索找到详细的使用方法以及安装过程。
然后我们在网站http://code.google.com/p/swfupload/中可以下载swfupload工具。在这个下载的包中我们可以看到有几个我们需要用到的包,swfupload.js、swfupload.queue.js、swfupload.swfobject.js、
handlers.js、fileprogress.js,以及swfupload.swf文件。其中js文件可以放到assets/javascript下,swf文件可以在assets下新建一个文件夹存放。
准备工作到这里就完成了。
四、使用步骤。
1.首先在views/demo.html.erb中加入js代码。
- var swfu;
-
- window.onload = function() {
-
- var settings = {
-
- flash_url : "/assets/swfupload.swf",
-
- upload_url: "swfuploadfile.js",
-
- post_params: {"utf8":"✓","authenticity_token" : "<%= form_authenticity_token %>"},
-
- file_size_limit : "100 MB",
-
- file_types : "*.png;*.jpg;*.jpeg,*.pjpeg;*.bmp;*.gif",
-
- file_types_description : "All Files",
-
- file_upload_limit : 100,
-
- file_queue_limit : 0,
-
- custom_settings : {
-
- progressTarget : "fsUploadProgress",
-
- cancelButtonId : "btnCancel"
-
- },
-
- debug: false,
-
-
-
-
-
- button_p_w_picpath_url: "/assets/swfupload_button_back.png",
-
- button_width: "96",
-
- button_height: "32",
-
- button_placeholder_id: "spanButtonPlaceHolder",
-
- button_text: '<span class="theFont"></span>',
-
- button_text_style: ".theFont { font-size: 14;color:#000000; font-}",
-
- button_text_left_padding: 12,
-
- button_text_top_padding: 3,
-
-
-
-
-
- file_queued_handler : fileQueued,
-
- file_queue_error_handler : fileQueueError,
-
- file_dialog_complete_handler : fileDialogComplete,
-
- upload_start_handler : uploadStart,
-
- upload_progress_handler : uploadProgress,
-
- upload_error_handler : uploadError,
-
- upload_success_handler : successUpload,
-
- upload_complete_handler : uploadComplete,
-
- queue_complete_handler : queueComplete
-
- };
-
- swfu = new SWFUpload(settings);
-
- };
//上传成功后回调的方法
- function successUpload(file, serverData){
-
-
-
-
然后在页面中加入:
//上传按钮以及全部取消按钮
- <span id="spanButtonPlaceHolder"></span>
- <input id="btnCancel" type="button" value="Cancel All Uploads" onclick="swfu.cancelQueue();" disabled="disabled" style="margin-left: 2px; font-size: 8pt; height: 29px;" class="show_none" />
之后再加入(前一句是显示上传的过程,包括进度条。后面一句是上传状态,成功 或者失败。)
- <div class="fieldset flash" id="fsUploadProgress"></div>
-
- <div id="divStatus" class="show_none"></div>
到这里前端页面的配置基本完成。
然后再到controller里面看一下。因为在前面配置的时候是以js方式访问,所以返回也是以js的方式返回。
- def swfuploadfile
- respond_to do |format|
- format.js
- end
- end
接着,再到views/里面跟你的demo.html.erb同级。新建文件swfuploadfile.js.erb
这个文件名字要跟controller里的方法名称一致。
然后在swfuploadfile.js.erb中写你要做的操作,这个文件里面的内容就是上面js中serverData返回的数据。
完美完成。现在可以试试了。
还有不明白的或者写的不到位的,留言告诉我吧。