前一段时间项目需求要实现一个多文件上传的问题,项目框架为SSH,使用的是ExtJs的一个不是很成熟的插件UloadDialog上查了好多资料,发现好多都是copy有粘贴的内容,都很雷同,其中的一些问题还是要自己才找到答案,现在功能基本实现了,把我的代码贴出来供大家学习使用:
另外:咨询一个问题:使用UploadDialog能否实现一个选多个文件的?如果有哪位朋友实现了,帮忙贴出来供大家学习呀。
1.前台代码
在前台的html代码中只需要引入UploadDialog的包,在引入含下面代码的JS就可以使用了,很简单。
<!--当然,这里的路径要根据你自己放置的UploadDialog.js的路径来确定-->
<script type="text/javascript" src="${webRoot}/scriptLib/ext-3.2.1/Ext.ux.UploadDialog/UploadDialog/UploadDialog.js"></script>
<link rel="stylesheet" type="text/css" href="${webRoot}/ext-3.2.1/Ext.ux.UploadDialog/css/Ext.ux.UploadDialog.css"/>
2.upload.js
function btn_show(){
var subject = Ext.getCmp('subjectId').getValue();
var role = Ext.getCmp('roleId').getValue();
var publicSound = Ext.getCmp('publicSoundId').getValue();
if(subject==""||role==""){
Ext.MessageBox.alert('提示信息', '请先选择音频科目和角色');
}else{
var dialog = new Ext.ux.UploadDialog.Dialog({
autoCreate : true,
minWidth : 450,
minHeight : 300,
fileSize : 10*1024*1024,
title : '文件上传', //是否自动上传
permitted_extensions: ['MP3','mp3','MP4','mp4','WMA','wma'], //允许上传的文件的类型,区分大小写
closable : true,
collapsible : false,
draggable : true,
proxyDrag : true,
resizable : true,
constraintoviewport : true,
modal : true,
reset_on_hide : false,
allow_close_on_upload: true,
url : 'uploadAudioHandelAction.action',
base_params :{
subjectID : subject,
roleID : role,
publicSound : publicSound,
userName : userName
}
});
dialog.show('show-button');
dialog.on('uploadsuccess',onUploadSuccess);//定义上传前的回调函数
dialog.on('uploaderror',onUploadFailed); //定义上传出错回调函数
dialog.on('fileadd',onFileAdd);//定义添加文件时验证文件的函数
dialog.on('uploadcomplete',onUploadComplete);//定义所有文件上传完成回调函数
}
};
3.行处理的java代码:
package com.dfsoft.lion.process.demo.control.model.dismodel.audio;
import java.io.File;
import java.util.Date;
import com.dfsoft.lion.commons.EagleBaseAction;
import com.dfsoft.lion.domain.demo.measurement.entity.Audio;
import com.dfsoft.lion.domain.demo.measurement.entity.AudioSubjectInfo;
import com.dfsoft.lion.domain.demo.measurement.entity.Role;
import com.dfsoft.lion.domain.demo.measurement.entity.Users;
import com.dfsoft.lion.process.demo.process.model.dismodel.AudioProcess;
import com.dfsoft.lion.process.demo.process.model.dismodel.AudioSubjectInfoProcess;
import com.dfsoft.lion.process.demo.process.model.dismodel.RoleProcess;
import com.dfsoft.lion.process.demo.process.model.dismodel.UsersProcess;
import org.apache.commons.io.FileUtils;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
/**
* @描述:上传音频处理Action
* @author lichenglin
*
*/
public class UploadAudioHandelAction extends EagleBaseAction {
/**
*
*/
private static final long serialVersionUID = 7716496253903888292L;
private Long subjectID ;//科目ID
private Long roleID ;// 角色ID
private int publicSound;
private String userName ;
private String filesPath;
//接收文件信息
private File[] files;
private String[] filesFileName;
private String[] filesContentType;
transient private AudioProcess audioProcess;
transient private RoleProcess roleProcess;
transient private AudioSubjectInfoProcess audioSubjectInfoProcess;
transient private UsersProcess usersProcess;
transient private GetPath getPath;
public String execute() throws Exception{
Audio audio = new Audio() ;
Users users = this.usersProcess.getUserByName("userName", userName);
AudioSubjectInfo audioSubjectInfo = new AudioSubjectInfo();
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=GBK");
response.setCharacterEncoding("GBK");
Role role = this.roleProcess.getRole(roleID);
/*文件存放路径:为根路径+角色名*/
String path = getPath.getFilesPath()+"/"+role.getRoleName();
String filePath = null ; //写入数据库的文件的路径
double audioSize = 0; //文件大小
for(int i = 0 ; i < files.length ; i++){
File io = new File(path,filesFileName[i]);
try{
/*对文件进行处理*/
audioSize = (files[i].length())/1024;//将文件大小从字节数(byte)转化成(KB)为单位
filePath = path+"/"+filesFileName[i];
/*音频属性*/
audio.setAudioName(filesFileName[i]);
audio.setAudioSize(audioSize);
audio.setDownloads(0); //初始化下载次数为0
audio.setFilePath(filePath);
if(publicSound==2){
audio.setIsPublicSound(false);//2表示“否”
// System.err.println("否");
}else if(publicSound==1){
audio.setIsPublicSound(true);//1表示“是”
// System.err.println("是");
}
audio.setRoleID(roleID); //音频上传人
audio.setUploadDate(new Date());//音频上传时间为当前时间
audio.setUserID(users.getUserID());
/*判断当前音频是否已存在*/
Audio temp_audio = this.audioProcess.getAudioByName("audioName",filesFileName[i]);
if(temp_audio==null){ //所上传的音频尚不存在
/*上传音频到服务器*/
FileUtils.copyFile(files[i],io);
this.audioProcess.addAudio(audio,subjectID);
response.getWriter().write("{success:true,message:'上传新文件成功'}");
}else if(temp_audio!=null){
audioSubjectInfo.setAudioID(temp_audio.getAudioID());
audioSubjectInfo.setSubjectID(subjectID);
AudioSubjectInfo temp_auAudioSubjectInfo = this.audioSubjectInfoProcess.getAudioSubjectInfo(audioSubjectInfo);
if(temp_auAudioSubjectInfo==null){
/*该音频已经上传,但未关联该科目,则直接向关系表中添加一条关系数据*/
this.audioSubjectInfoProcess.addAudioSubjectInfo(audioSubjectInfo);
response.getWriter().write("{success:true,message:'上传文件成功'}");
}
else{
/*同音频同科目已经被上传,则不再上传,直接返回false*/
response.getWriter().write("{success:true,message:'该文件已经被上传'}");
}
}
}catch (Exception e) {
response.getWriter().write("{success:false,message:'上传文件失败'}");
e.printStackTrace();
}
}
return NONE;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUsersProcess(UsersProcess usersProcess) {
this.usersProcess = usersProcess;
}
public void setAudioSubjectInfoProcess(
AudioSubjectInfoProcess audioSubjectInfoProcess) {
this.audioSubjectInfoProcess = audioSubjectInfoProcess;
}
public void setRoleProcess(RoleProcess roleProcess) {
this.roleProcess = roleProcess;
}
public Long getSubjectID() {
return subjectID;
}
public void setSubjectID(Long subjectID) {
this.subjectID = subjectID;
}
public Long getRoleID() {
return roleID;
}
public void setRoleID(Long roleID) {
this.roleID = roleID;
}
public int getPublicSound() {
return publicSound;
}
public void setPublicSound(int publicSound) {
this.publicSound = publicSound;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public void setAudioProcess(AudioProcess audioProcess) {
this.audioProcess = audioProcess;
}
public File[] getFiles() {
return files;
}
public String[] getFileFilesName() {
return filesFileName;
}
public String[] getFilesContentType() {
return filesContentType;
}
public void setFiles(File[] files) {
this.files = files;
}
public void setFilesFileName(String[] filesFileName) {
this.filesFileName = filesFileName;
}
public void setFilesContentType(String[] filesContentType) {
this.filesContentType = filesContentType;
}
public String getFilesPath() {
return filesPath;
}
public void setFilesPath(String filesPath) {
this.filesPath = filesPath;
}
public void setGetPath(GetPath getPath) {
this.getPath = getPath;
}
}
当然,其中还有一些其他的参数,请各位在参考的时候灵活些。
另外:注意,在前面dialog生成时,我并没有给他fileName 我尝试过写fileName属性,可是那样会出现java代码中fileName=null的错误,经过多次尝试,我就把那个去掉了,后面实现也没问题了。
还有:java代码中,response返回的字符串是必须的,如果没有写返回,则前面dialog的grid框中总是提示上传错误。因为没有收到success的标识。
分享到:
相关推荐
晋城市-晋城市-街道行政区划_140500_Shp数据-wgs84坐标系.rar
内容概要:本文档汇总了46个经典的Linux面试题及其答案,涵盖了Linux系统操作的基本命令和概念。内容涉及路径表示与目录切换、进程管理、文件和目录操作、权限设置、文件内容查看等多个方面。每个问题都给出了明确的答案,旨在帮助面试者全面掌握Linux命令行操作技能,同时加深对Linux系统原理的理解。 适合人群:准备Linux相关职位面试的求职者,尤其是有一定Linux基础但缺乏实战经验的技术人员。 使用场景及目标:①用于个人自学或面试前复习,巩固Linux基础知识;②作为企业内部培训资料,帮助员工提升Linux操作水平;③为初学者提供系统化的学习指南,快速入门Linux命令行操作。 其他说明:文档内容侧重于实际操作命令的讲解,对于每个命令不仅提供了基本语法,还解释了具体应用场景,有助于读者更好地理解和记忆。建议读者在学习过程中多加练习,将理论知识转化为实际操作能力。
街道级行政区划shp数据,wgs84坐标系,直接下载使用。
内容概要:本文提供了10道华中杯C++竞赛真题的详细解析,涵盖多种基础编程技能与高级特性。每道题目不仅包含详细的解题思路和代码实现,还附带了完整的运行结果。具体包括:函数参数传递(指针实现)、宏定义比较、数组元素打印、几何图形面积计算、字符串拼接、素数判断、多态的实现、文件操作、简单计算器和学生信息管理。这些题目帮助读者深入理解C++语言的核心概念和技术应用。 适合人群:对C++有一定了解的编程初学者和中级开发者,尤其是准备参加编程竞赛的学生或程序员。 使用场景及目标:①作为编程练习和竞赛备考资料,帮助读者掌握C++的基本语法和常用算法;②通过实际代码示例加深对C++特性的理解,如指针、宏定义、面向对象编程等;③提供完整的源码供读者参考和调试,增强动手能力和问题解决能力。 阅读建议:建议读者按照题目难度逐步学习,先理解题目背景和解题思路,再仔细研读代码实现,并尝试独立编写和调试代码。同时,鼓励读者扩展思考,探索更多可能的解决方案,以提高编程水平。
街道级行政区划shp数据,wgs84坐标系,直接使用。
街道级行政区划shp数据,wgs84坐标系,直接使用。
通用计算器的设计FPGA.doc
晋城市-沁水县-街道行政区划_140521_Shp数据-wgs84坐标系.rar
赤峰市-松山区-街道行政区划_150404_Shp数据-wgs84坐标系.rar
JAVA中Stream编程常见的方法分类
街道级行政区划shp数据,wgs84坐标系,直接使用。
大同市-浑源县-街道行政区划_140225_Shp数据-wgs84坐标系.rar
包头市-昆都仑区-街道行政区划_150203_Shp数据-wgs84坐标系.rar
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
街道级行政区划shp数据,wgs84坐标系,直接下载使用。
内容概要:本文详细介绍了车载电子电器架构中的网络拓扑开发,涵盖开发概述、车载网络总线、网络设计原则、开发流程及小结。网络拓扑开发是汽车电气架构中的重要环节,旨在设计合理的网络结构以确保各电子控制单元(ECU)之间的高效通信。文中阐述了通信协议选择、网络节点布局、通信介质选择、拓扑结构设计及安全性考虑等关键要素,并强调了仿真与验证的重要性。此外,还讨论了网络设计的原则,如前瞻性、兼容性、拓展性、实时性、可靠性和安全性,以及网络负载的优化措施。最后,总结了网络拓扑开发的流程,包括需求分析、设计、仿真验证、优化迭代及文档记录。 适合人群:汽车电子工程师、各域功能工程师、子系统及零部件开发者、测试工程师等从事汽车电气架构开发的相关人员。 使用场景及目标:①帮助工程师理解汽车网络拓扑开发的关键步骤和技术要点;②指导工程师在设计过程中遵循科学合理的设计原则,确保网络拓扑的高性能和可靠性;③提供网络负载优化的措施,确保数据传输的实时性和效率。 其他说明:网络拓扑开发不仅需要考虑技术层面的因素,还需兼顾成本效益,以适应不断变化的市场需求和技术趋势。本文建议读者在实践中不断积累经验,关注新技术的应用和发展,以应对未来的挑战和机遇。
内容概要:本文探讨了智能分析AI Agent在金融行业的先进实践与展望,指出金融行业在经营分析领域面临的现状和痛点,包括管理团队无法快速获得深度结论,业务团队面对BI产品学习门槛高、依赖人工等问题。文中介绍了智能分析AI Agent相较于传统解决方案的技术创新,如数据建模右移、基于虚拟层的数据编织、指标平台与大模型组合方案等,强调其在降低使用门槛、提高效率和增强交互性方面的优势。同时,文章展示了智能分析AI Agent在交互式指标问询、自动分析报告生成等应用场景中的价值,并对未来的发展进行了展望。 适合人群:金融行业的管理层、业务分析师、数据科学家以及对金融科技感兴趣的从业者。 使用场景及目标:①帮助管理层快速获取数据背后的深层次原因和结论;②降低业务团队使用数据分析工具的门槛,提高工作效率;③实现数据的自动化处理和分析,减少人工干预;④推动企业内部的数据民主化,使更多员工能够参与数据分析和决策。 阅读建议:本文不仅提供了智能分析AI Agent的技术细节,还结合实际案例展示了其应用效果,因此在阅读过程中应重点关注技术创新点及其对企业管理和业务流程的具体影响。
街道级行政区划shp数据,wgs84坐标系,直接下载使用。