struts2结合swfupload控件实现视频等大文件上传

时间:2022-08-30 10:24:05

         由于一个项目要使用struts2来接受视频文件,于是我就从网上找各种资料,最终实现了文件的上传,可是突然遇到了一个问题,那就是我发现我上传文件时只能上传图片等小文件,于是乎我就查,发现了很多网上设置文件大小的方法,我就去不断地设置,可是还是不能,最后终于发现问题不在struts2的拦截器里面,而是struts默认能上传的最大文件只有2M,因此需要更改配置文件。

        上传文件可以使用html的控件(<input type="file" >),但是很不实用,根本不能实现一些特殊的功能,经过多番的对比我感觉还是SWFUpload比较好用,他的用法比较容易掌握,而且是开源的,功能很强大。

      先上图吧:

struts2结合swfupload控件实现视频等大文件上传

选择文件:struts2结合swfupload控件实现视频等大文件上传

正在上传:struts2结合swfupload控件实现视频等大文件上传

上传成功struts2结合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;  
    }  
  
}