由于一个项目要使用struts2来接受视频文件,于是我就从网上找各种资料,最终实现了文件的上传,可是突然遇到了一个问题,那就是我发现我上传文件时只能上传图片等小文件,于是乎我就查,发现了很多网上设置文件大小的方法,我就去不断地设置,可是还是不能,最后终于发现问题不在struts2的拦截器里面,而是struts默认能上传的最大文件只有2M,因此需要更改配置文件。
上传文件可以使用html的控件(<input type="file" >),但是很不实用,根本不能实现一些特殊的功能,经过多番的对比我感觉还是SWFUpload比较好用,他的用法比较容易掌握,而且是开源的,功能很强大。
先上图吧:
选择文件:
正在上传:
上传成功
完美实现SWFUpload与struts的完美结合。
接下来就写一下实现的方法吧:
首先把swfupload.swf swfupload.js放入项目包中,让后把配置struts,
<struts> <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <constant name="struts.multipart.maxSize" value="1000000000" /><!-- 这个是更改struts默认文件大小的配置,默认为2M--> <package name="default" namespace="/" extends="struts-default"> <action name="upload" class="org.swf.Upload"> <interceptor-ref name="fileUpload"> <param name="maximumSize">102400000</param><!-- 这个是更改struts拦截器拦截文件大小--> </interceptor-ref> <result name="success">/Hello.jsp</result> <result name="input">/index.jsp</result> <interceptor-ref name="defaultStack" /> </action> </package> </struts>
接下来便是index.jsp的内容:
首先是swf的初始化:
<script type="text/javascript">
var swfu;
window.onload = function() {
var settings = {
flash_url : "swfupload.swf",
flash9_url : "swfupload_fp9.swf",
upload_url : "upload.action",//指向web项目下的名为upload的action
file_size_limit : "10000 MB",//设置文件大小
file_types : "*.*",//上传文件的类型
file_types_description : "All Files",
file_upload_limit : 100,
file_queue_limit : 0,//
debug : false,
// Button settings
button_image_url : "images/XPButtonUploadText_61x22.png",
button_width : "61",
button_height : "22",//设置按钮大小,注意一定要写
button_placeholder_id : "spanButtonPlaceHolder",
moving_average_history_size : 40,
// 这里是各种触发事件,这些事件都在js中响应,一般写在handle.js中
//在触发这些事件对js进行加载
swfupload_preload_handler : preLoad,//预载文件
swfupload_load_failed_handler : loadFailed,//加载文件失败
file_queued_handler : fileQueued,//用于处理选择文件后触发的事件
file_dialog_complete_handler : fileDialogComplete,//用于处理选择文件后触发的事件
upload_start_handler : uploadStart,//用于处理文件开始上传
upload_progress_handler : uploadProgress,
upload_success_handler : uploadSuccess,//上传成功处理
upload_complete_handler : uploadComplete,//上传完成处理
};
swfu = new SWFUpload(settings);
};
</script>
接下来便是上传按钮:
<div class="marginright">
<span id="spanButtonPlaceHolder"></span>
<button id="bt" onclick="swfu.startUpload()" style="width: 61px; height: 22px;" >上传</button>
</div>
第一个用来选择文件,第二个用来调用start函数开始上传。
function insRow(j) {
var x = document.getElementById('uptable').insertRow(j);
var y1 = x.insertCell(0);
var y2 = x.insertCell(1);
var y3 = x.insertCell(2);
var y4 = x.insertCell(3);
var y5 = x.insertCell(4);
var y6 = x.insertCell(5);
y1.innerHTML = "<input name='textname" + j + "' id='textname" + j
+ "' type='text' size='20' />";
y2.innerHTML = "<input name='size" + j + "' id='size" + j
+ "' type='text' size='20' />";
y3.innerHTML = "<input name='speed" + j + "' id='speed" + j
+ "' type='text' size='20' />";
y4.innerHTML = "<input name='remain" + j + "' id='remain" + j
+ "' type='text' size='20' />";
y5.innerHTML = "<input name='present" + j + "' id='present" + j
+ "' type='text' size='20' />";
y6.innerHTML = "<input name='state" + j + "' id='state" + j
+ "' type='text' size='20' />";
}
这是动态添加表格的js代码,每选一个 便能插入一行表格
最后便是struts接受传来的数据了:
package org.swf;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.opensymphony.xwork2.ActionSupport;
public class Upload extends ActionSupport {
//Filedata属性用来封装上传的文件
private File Filedata;
// FileName属性用来封装上传文件的文件名
private String Filename;
public File getFiledata() {
return Filedata;
}
public void setFiledata(File filedata) {
Filedata = filedata;
}
public String getFilename() {
return Filename;
}
public void setFilename(String filename) {
Filename = filename;
}
public String execute() throws Exception {
//基于myFile创建一个文件输入流
InputStream is = new FileInputStream(Filedata);
// 设置上传文件目录
String uploadPath ="d:/receive/" ;
// 设置目标文件
File toFile = new File(uploadPath, this.getFilename());
// 创建一个输出流
OutputStream os = new FileOutputStream(toFile);
//设置缓存
byte[] buffer = new byte[1024];
int length = 0;
//读取myFile文件输出到toFile文件中
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
System.out.println("上传文件名"+Filename);
//关闭输入流
is.close();
//关闭输出流
os.close();
return SUCCESS;
}
}