很多开发的时候会遇到附加上传功能,最近项目中使用的是uploadswf插件,SWF主要是多文件无刷新上传,利用flash完成多文件上传操作下面把java开发中使用简单的介绍一下:
Jsp页面代码:
先在头部引入要使用到的样式文件和js文件
<linkhref="${ctx}/resource/uploadswf/default.css"rel="stylesheet"type="text/css"/>
<scripttype="text/javascript"src="${ctx}/resource/uploadswf/swfupload.js"></script>
<scripttype="text/javascript"src="${ctx}/resource/uploadswf/swfupload.queue.js"></script>
<scripttype="text/javascript"src="${ctx}/resource/uploadswf/fileprogress.js"></script>
<scripttype="text/javascript"src="${ctx}/resource/uploadswf/handlers.js"></script>
<!—使用的js方法 -->
<scripttype="text/javascript">
var upload1;
window.onload = function() {
upload1 = new SWFUpload({
// Backend Settings
upload_url: "${ctx}/suqiu/topical-upload.action",//上传文件的action
file_post_name: "file",
post_params: {"contentId" :$("#msgContentId").val()},
//要使用到的参数,contentId在后台设置set get方法,不传就为空
// File Upload Settings
file_size_limit : "10240", // 100MB大小自己设置
file_types : "*.*",
file_types_description :"All Files",//文件类型自己控制
file_upload_limit :"10",
file_queue_limit :"10",
// Event HandlerSettings (all my handlers are in the Handler.js file)
file_dialog_start_handler : fileDialogStart,
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 : uploadSuccess,
upload_complete_handler : uploadComplete,
// ButtonSettings
button_image_url :"${ctx}/resource/uploadswf/XPButtonUploadText_61x22.png",
button_placeholder_id :"spanButtonPlaceholder1",
button_width: 61,
button_height: 22,
button_text:"添加附件",
button_text_left_padding:5,
// Flash Settings
flash_url : "${ctx}/resource/uploadswf/swfupload.swf",
custom_settings : {progressTarget :"fsUploadProgress1",
cancelButtonId :"btnCancel1"
},
// Debug Settings
debug: false
});
//$("#SWFUpload_0").hide();
}
function deleteAttach(attachId,value){
if(confirm("确定要删除该附件吗?")){
$.post("${ctx}/suqiu/topicattach-delete.action?key="
+ attachId,function(data) {
if (data =="no") {
alert("删除失败");
}else{
alert("删除成功");
window.location.reload();
}
}
);}
}
//说明:插入(上传成功)、删除等方法在handlers.js里面定义,页面里不重写的话使用默认的,重写可以自己定义和传不同的参数
<!—页面代码 -->
<tr>
<tdclass="text"> 附件:</td>
<tdcolspan='2'>
<divstyle="padding-left:5px;">
<spanid="spanButtonPlaceholder1"></span>
<inputid="btnCancel1"type="button"value="取消上传"onclick="cancelQueue(upload1);"disabled="disabled"style="margin-left:2px;height:22px;font-size: 8pt;"/>
<br/>
<div class="fieldset flash"id="fsUploadProgress1">
<s:iterator value="topicalContent. Attachs"status="u">
<divclass="progressWrapper" id='FWSWFUpload<s:propertyvalue="#u.index"/>' style="opacity:1;">
<div class="progressContainerblue">
<aclass="progressCancel" href="#"style="visibility:visible;"> </a>
<div class="progressName"><inputtype="button" class="ico_attbig"><s:propertyvalue="attachName" /></div>
<div class="progressBarStatus">
<a onclick="deleteAttach('<s:propertyvalue="attachId"/>',this);" href="#this">删除</a></div>
<div class="progressBarComplete"style=""></div>
</div>
</div>
</s:iterator>
</div>
</div>
</td>
</tr>
以上循环遍历出来了已经存在的附件,然后可以继续上传和删除。
后台action代码:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.json.JSONObject;
@Action(value="topicalcontent-upload")
public String saveAttach(){
TopicContentAttach noticeAttachs=newTopicContentAttach();
TopicalContent obj=null;
if(msgContentId!=null&&StringUtils.isNotBlank(msgContentId)){
obj = topicalContentService.getTopicalContent(msgContentId);
}else{
obj= new TopicalContent();
}
noticeAttachs.setTopicalcontent(obj);
String nameflll=upload();
noticeAttachs.setAttachUrl(FilePathSptUtil.UPLOAD_CMS+FilePathSptUtil.URL_SPT+FilePathSptUtil.CMS_ZHUANTI+
FilePathSptUtil.URL_SPT+DateUtil.formatDateToString(new Date(), "yyyy-MM")+FilePathSptUtil.URL_SPT+nameflll);
noticeAttachs.setAttachName(fileFileName);
noticeAttachs.setUploadOriginName(fileFileName);
String fileExtend = fileFileName.substring(fileFileName.lastIndexOf(".")+1,fileFileName.length());
noticeAttachs.setAttachType(fileExtend);
topicContentAttachService.save(noticeAttachs);
return renderText( "{ attachId:\"" +noticeAttachs.getAttachId()+ "\" , attachName:\"" +noticeAttachs.getAttachName()+ "\" , attachUrl:\"" +noticeAttachs.getAttachUrl()+ "\" }" );}
private Stringupload(){
SimpleDateFormat formater =new SimpleDateFormat("yyyyMMddhhmmssSSSS");
String filename=formater.format(new Date());
String fileExtend = fileFileName.substring(fileFileName.lastIndexOf(".")+1,fileFileName.length());
String root= FilePathSptUtil.UPLOAD_ROOT_PATH+FilePathSptUtil.UPLOAD_CMS+SPT+FilePathSptUtil.CMS_ZHUANTI+SPT+
DateUtil.formatDateToString(new Date(),"yyyy-MM");
String fullName=filename+"."+fileExtend;
String dstPath = root+SPT+fullName; //全路径
File dirFile = new File(root);
boolean isDir = dirFile.isDirectory();
if(!isDir){//目录不存在则先建目录
try{
dirFile.mkdirs();
}catch (Exception e) {
File delFile = new File(root+SPT +fullName );
deleteExitsFile(delFile);
}
}
FileUtil.copyFile(file.getPath(), dstPath);//上传文件
return fullName;
}
private voiddeleteExitsFile(File file) {
if(file.exists() && file.isFile()){
file.delete();
}
}
其中一些常量变量定义好:
private StringfileFileName;
private Filefile;
private StringcontentId;
privatestaticfinal StringPATH =FilePathSptUtil.UPLOAD_ROOT_PATH;
privatestaticfinal StringSPT=File.separator;
// UPLOAD_ROOT_PATH在FilePathSptUtil类中定义,从配置文件读取的路径
UPLOAD_ROOT_PATH =prop.getProperty("upload.root.path","/");
public StringgetContentId() {
return contentId;
}
publicvoidsetContentId(String contentId) {
this.contentId = contentId;
}
public File getFile() {
returnfile;
}
publicvoid setFile(File file){
this.file = file;
}
public String getFileFileName() {
returnfileFileName;
}
publicvoidsetFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
其中在struts2中在非IE内核的浏览器里会提示上传错误报302错误,接下来解决。
Upload_url:”${ctx}/suqiu/topicalcontent-upload.action;jsessionid=<%=request.getSession().getId()%>”;
附件下载: http://download.csdn.net/detail/shiyuezhong/4552201