表结构设计
前端页面
java代码
多文件上传在平时工作经常遇到,有些需要有些附件进行上传,常用有两种方式一种是上传到服务器中进行储存,另外一种是储存在数据库blob类型字段中。工作推荐使用上传到服务器中进行储存。
下面是从我日常模块抽取出来的小模块进行分享。
create table t_versionManage
(
fDiseq number(18,0) not null,
--序号 主键
FResName VARCHAR2(200),
--项目名称
FDesc VARCHAR2(2000),
--说明
FVersion VARCHAR2(50),
--版本号
fName VARCHAR2(50),
--acl_user.name 发布人姓名
fUserName VARCHAR2(50),
--acl_user.username 发布人id
FDept VARCHAR2(50),
--发布人部门号
FOpDt DATE not null,
--发布日期
constraint CON_PK_versionManage primary key (fDiseq)
);
CREATE SEQUENCE SEQ_VERSION INCREMENT BY 1 START WITH 1 MAXVALUE 10E16 MINVALUE 1 NOCYCLE NOCACHE ;
select d.*,rowid from t_versionmanage d
--附件表
CREATE TABLE t_File(
fid varchar2(50) NOT NULL,
--fk:t_File;.fid
fSeq Number(6,0) ,
--内部序号
fName varchar2(500) null,
--附件名称(文件名)
fKbsize Number(6,2) ,
--附件大小()
furl varchar2(500) ,
--附件内容
fDiseq number(18,0) not null,
--详细资料序号(外键) ---t_versionManage.fDiseq
fifvalid varchar2(2) default '1' not null,
--是否有效
constraint con_pk_tfile primary key( fid )
);
前端页面
前端页面需要注意的是这form表单记得加上**enctype ="multipart/form-data"** method=“post” 这里我们前端框架用freeMark和bootstarp,现在我们来看添加附件功能前端页面
//这里是对文件上传框进行修改样式
<style type="text/css">
.input-file{
display: inline-block;
position: relative;
overflow: hidden;
text-align: center;
width: auto;
background-color: #C0C0C0;
border: solid 1px #ddd;
border-radius: 4px;
padding: 5px 10px;
font-size: 12px;
font-weight: normal;
line-height: 18px;
color:#fff;
text-decoration: none;
}
.input-file input[type="file"] {
position: absolute;
top: 0;
right: 0;
font-size: 14px;
background-color: #fff;
transform: translate(-300px, 0px) scale(4);
height: 40px;
opacity: 0;
filter: alpha(opacity=0);
}
</style>
//这里对上传多个文件显示在下面
<script>
$(function(){
$(".input-fileup").on("change","input[type='file']",function(){
removed();
var a=this.files;
var html="";
for(var i=0;i<a.length;i++){
fileName=a[i].name;
html+='<p id="delet"><span id="sv">'+fileName+'</span></p>';
}
$(".showFileName1").append(html);
html="";
//$(this).val("");
})
})
function removed() {
$(".showFileName1").empty();
}
</script>
当然你们可以把文件上传框改为自己喜欢的样式
<div class="col-sm-3" style="width: 260px;" id="files" >
<!-- <input type="file" name="file" multiple="multiple" size="10" /> -->
<a class="input-file input-fileup" href="javascript:;">
选择文件<input size="10" type="file" name="file" id="file" multiple="multiple">
</a>
<div class="fileerrorTip1"></div>
<div class="showFileName1"></div>
<html>
<#assign rt=JspTaglibs[ "/WEB-INF/kycore.tld"] />
<#assign s=JspTaglibs[ "/WEB-INF/struts-tags.tld"]>
<head>
<title>行政版本系统管理</title>
<meta charset="UTF-8">
<#include "/includes/htmlHeadContent.ftl" />
<script type="text/javascript">
var flag = 0;
function save(theForm) {
if(flag > 0) {
alertMsg.info("请不要重复提交!");
return false;
}
//获取表格值
var fResName = $("#fResName").val();
var fVersion = $("#fVersion").val();
var fOpDt = $("#fOpDt").val();
if(!fResName) {
alertMsg.info("项目名称不能为空!");
return false;
}
if(!fVersion) {
alertMsg.info("版本号不能为空!");
return false;
}
if(!fOpDt) {
alertMsg.info("发布时间不能为空!");
return false;
}
if(fResName == null) {
alertMsg.info("项目名称不能为空!");
return false;
}
if(fVersion == null) {
alertMsg.info("版本号不能为空!");
return false;
}
if(fOpDt == null) {
alertMsg.info("发布时间不能为空!");
return false;
}
return iframeCallback(theForm, closeDialogConfirmCallback1);
}
function closeDialogConfirmCallback1(json) {
if(json.statusCode == kyfuse.statusCode.error) {
if(json.message && alertMsg)
alertMsg.error(json.message);
} else if(json.statusCode == kyfuse.statusCode.timeout) {
if(alertMsg)
alertMsg.error(json.message || kyfuse.msg("sessionTimout"), {
okCall: kyfuse.loadLogin
});
else
kyfuse.loadLogin();
} else {
writeBackData(json);
try {
var tabId = getCurrentTabId();
if(tabId && tabId.length > 0) {
parent.navTab.reloadFlag(tabId);
} else {
window.location.reload();
}
} catch(e) {
}
if(json.message && alertMsg) {
alertMsg.confirm(json.message + "<br/><br/><b>是否关闭当前标签页?</b>", {
okCall: function() {
closeWindowPage();
var url = 'querydz.action';
window.location.href = url;
}
});
}
}
}
function getCurrentTabId() {
var navTabId = "";
var navTabs = parent
.$("#navTab .tabsPageHeader .tabsPageHeaderContent .navTab-tab>li");
var tabIndex = parent.navTab._currentIndex - 1;
navTabs.each(function(i) {
if(tabIndex == i) {
navTabId = $(this).attr("tabid");
return false;
}
});
return navTabId;
}
function closeDialogNow() {
$("#close").click();
}
$(function() {
kyfuse.init();
});
//提交表单
function doSubmit() {
document.forms[0].submit();
}
</script>
<script type="text/javascript">
function reckon() {
var fOpDt = $("#fOpDt").val();
if(!fOpDt) {
alertMsg.info("发布时间不能为空!");
return false;
}
if(fOpDt == null) {
alertMsg.info("发布时间为空,必填!");
return false;
}
}
$(function() {
$('#btn')
.click(
function() {
var field = "<p/><p><input type='file' name='file'/><input type='text' value='删除' οnclick='removed(this);'/></p>";
$('#files').append(field);
});
});
function removed(o) {
$(o).parent().remove();
}
</script>
</head>
<body>
<input type="hidden" id="reflashTabId" value="${reflashTabId?if_exists}">
<div class="main-container" id="main-container">
<div class="row" style="margin-right: 0px;">
<div class="col-md-10 col-sm-10 col-xs-10 col-md-offset-1 col-sm-offset-1 col-xs-offset-1">
<!-- PAGE CONTENT BEGINS -->
<@s.form name="myform" namespace="/version" action="version_add.action" method="POST" cssClass="form-horizontal required-validate reg-page" id="validation-form" onsubmit="return save(this)" enctype ="multipart/form-data">
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field">项目名称:</label>
<div class="col-sm-8">
<input type="text" name="leaveVersion.fResName" id="fResName" style="width: 100%;" />
<font color="red">*(必填)</font>
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">发 布 人:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fName" readOnly="true" id="fName" style="width: 100%;" value="${leaveVersion.fName}" />
<input type="hidden" name="leaveVersion.fUserName" readOnly="true" id="fUserName" value="${leaveVersion.fUserName}" />
</div>
<label class="col-sm-2 control-label no-padding-right" for="form-field-1-1">部 门:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fDept" id="fDept" readOnly="true" style="width: 100%;" value="${leaveVersion.fDept}" />
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">  版本号:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fVersion" id="fVersion" style="width: 100%;" />
<font color="red">*(必填)</font>
</div>
<label class="col-sm-2 control-label no-padding-right" for="form-field-1-1">发布日期:</label>
<div class="col-sm-3" ">
<input class="input" type="date" name="leaveVersion.fOpDt" id="fOpDt" style="width: 100%;" value=${.now } onmouseout="reckon()" />
<font color="red">*(必填)</font>
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">版本说明:</label>
<div class="col-sm-8">
<textarea name="leaveVersion.fDesc" id="fDesc" cols="20" rows="5" style="width: 100%; height: 100px;" placeholder="请详细填写版本说明..."></textarea>
</div>
</div>
<div class="space-5"></div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1" > 文件:</label>
<div class="col-sm-3" style="width: 260px;" id="files" >
<!-- <input type="file" name="file" multiple="multiple" size="10" /> -->
<a class="input-file input-fileup" href="javascript:;">
选择文件<input size="10" type="file" name="file" id="file" multiple="multiple">
</a>
<div class="fileerrorTip1"></div>
<div class="showFileName1"></div>
</div>
<!-- <label class="col-sm-2 control-label no-padding-right" for="form-field-1"><input type="button" id="btn" class="btn btn-xs btn-warning ace-icon fa fa-file-text-o bigger-120"
value="添加" /></label> -->
</div>
<div class="clearfix form-actions">
<label class="col-md-4 col-sm-4 col-xs-4control-label no-padding-right" for="form-field-1"> </label>
<div class="col-md-6 col-sm-6 col-xs-6" style="color: red">
<button class="btn btn-success btn-round" type="submit" id="gritter-center">
<i class="ace-icon fa fa-check bigger-110"></i> 保存
</button>
<button class="btn btn-defalut btn-round clo" id="button1">
<i class="ace-icon fa fa-times bigger-110"></i> 取消
</button>
</div>
</div>
</@s.form>
</div>
</div>
</div>
</body>
<script>
$(function(){
$(".input-fileup").on("change","input[type='file']",function(){
removed();
var a=this.files;
var html="";
for(var i=0;i<a.length;i++){
fileName=a[i].name;
html+='<p id="delet"><span id="sv">'+fileName+'</span></p>';
}
$(".showFileName1").append(html);
html="";
//$(this).val("");
})
})
function removed() {
$(".showFileName1").empty();
}
</script>
<style type="text/css">
.input-file{
display: inline-block;
position: relative;
overflow: hidden;
text-align: center;
width: auto;
background-color: #C0C0C0;
border: solid 1px #ddd;
border-radius: 4px;
padding: 5px 10px;
font-size: 12px;
font-weight: normal;
line-height: 18px;
color:#fff;
text-decoration: none;
}
.input-file input[type="file"] {
position: absolute;
top: 0;
right: 0;
font-size: 14px;
background-color: #fff;
transform: translate(-300px, 0px) scale(4);
height: 40px;
opacity: 0;
filter: alpha(opacity=0);
}
</style>
</html>
上面这些是是对文件上传页面代码,下面我们看看下载页面代码,下载比较简单就是相当于传一个href 对其进行下载就行
<html>
<#assign rt=JspTaglibs[ "/WEB-INF/kycore.tld"] />
<#assign s=JspTaglibs[ "/WEB-INF/struts-tags.tld"]>
<head>
<#include "/includes/htmlHeadContent.ftl" />
<script type="text/javascript" src="../js/showOrgTree.js"></script>
<link rel="stylesheet" href="../ztree/css/zTreeStyle/zTreeStyle.css" type="text/css" />
<script type="text/javascript" src="../ztree/js/jquery.ztree.core-3.5.js"></script>
<script type="text/javascript" src="../ztree/js/jquery.ztree.excheck-3.5.js"></script>
<script type="text/javascript" src="../js/ace-framework/additional-methods.js"></script>
<meta charset="UTF-8">
<title>项目版本明细管理</title>
<script type="text/javascript">
var flag = 0;
// function tile(){alert("1111111");}
function save(theForm) {
if(flag > 0) {
alertMsg.info("请不要重复提交!");
return false;
}
//获取表格值
var fResName = $("#fResName").val();
var fVersion = $("#fVersion").val();
var fOpDt = $("#fOpDt").val();
if(!fResName) {
alertMsg.info("项目名称不能为空!");
return false;
}
if(!fVersion) {
alertMsg.info("版本号不能为空!");
return false;
}
if(!fOpDt) {
alertMsg.info("发布时间不能为空!");
return false;
}
if(fResName == null) {
alertMsg.info("项目名称不能为空!");
return false;
}
if(fVersion == null) {
alertMsg.info("版本号不能为空!");
return false;
}
if(fOpDt == null) {
alertMsg.info("发布时间不能为空!");
return false;
}
return iframeCallback(theForm, closeDialogConfirmCallback1);
}
function closeDialogConfirmCallback1(json) {
if(json.statusCode == kyfuse.statusCode.error) {
if(json.message && alertMsg)
alertMsg.error(json.message);
} else if(json.statusCode == kyfuse.statusCode.timeout) {
if(alertMsg)
alertMsg.error(json.message || kyfuse.msg("sessionTimout"), {
okCall: kyfuse.loadLogin
});
else
kyfuse.loadLogin();
} else {
writeBackData(json);
try {
var tabId = getCurrentTabId();
if(tabId && tabId.length > 0) {
parent.navTab.reloadFlag(tabId);
} else {
window.location.reload();
}
} catch(e) {
}
if(json.message && alertMsg) {
alertMsg.confirm(json.message + "<br/><br/><b>是否关闭当前标签页?</b>", {
okCall: function() {
closeWindowPage();
var url = 'querydz.action';
window.location.href = url;
}
});
}
}
}
function getCurrentTabId() {
var navTabId = "";
var navTabs = parent
.$("#navTab .tabsPageHeader .tabsPageHeaderContent .navTab-tab>li");
var tabIndex = parent.navTab._currentIndex - 1;
navTabs.each(function(i) {
if(tabIndex == i) {
navTabId = $(this).attr("tabid");
return false;
}
});
return navTabId;
}
function closeDialogNow() {
$("#close").click();
}
$(function() {
kyfuse.init();
});
//提交表单
function doSubmit() {
document.forms[0].submit();
}
</script>
<script type="text/javascript">
function reckon() {
var fOpDt = $("#fOpDt").val();
if(!fOpDt) {
alertMsg.info("发布时间不能为空!");
return false;
}
if(fOpDt == null) {
alertMsg.info("发布时间为空,必填!");
return false;
}
}
$(function() {
$('#btn')
.click(
function() {
var field = "<p><input type='file' name='file'/><input type='button' value='删除' οnclick='delete();'/></p>";
$('#files').append(field);
});
});
function removed(o) {
$(o).parent().remove();
}
$(function() {
alert(fId);
$("#deleteFile")
.click(
function(fId) {
alertMsg
.confirm(
"确认要删除吗?",
"删除文件",
function(r) {
if(r) {
window.location = "version_deleteFile.action?leaveFile.fId=" +
fId;
}
});
});
});
</script>
</head>
<body>
<input type="hidden" id="reflashTabId" value="${reflashTabId?if_exists}">
<div class="main-container" id="main-container">
<div class="page-content">
<div class="row" style="margin-right: 0px;">
<div class="col-md-10 col-sm-10 col-xs-10 col-md-offset-1 col-sm-offset-1 col-xs-offset-1">
<!-- PAGE CONTENT BEGINS -->
<@s.form name="myform" namespace="/version" action="version_edit.action" method="POST" cssClass="form-horizontal required-validate reg-page" id="validation-form" onsubmit="return save(this)"> <input class="input" type="hidden" name="leaveItem.dm" value="leaveItem.dm" /> <input type="hidden" name="leaveItem.id" id="name" value="${leaveItem.id}" readonly="readonly" style="width: 220px;" /> <input class="input" type="hidden" name="leaveItem.dept" value="${leaveItem.dept}" /> <input class="input" type="hidden" name="leaveItem.job" value="${leaveItem.job}" /> <input class="input" type="hidden" name="leaveItem.jobTitle" value="${leaveItem.jobTitle}" />
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">项目名称:</label>
<div class="col-sm-8">
<input type="text" name="leaveVersion.fResName" id="fResName" value="${leaveVersion.fResName}" style="width: 100%;" />
<font color="red">*(必填)</font>
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1-1">发 布 人:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fName" readOnly="true" id="fName" style="width: 100%;" value="${leaveVersion.fName?if_exists}" /> <input type="hidden" name="leaveVersion.fUserName" readOnly="true" id="fUserName" style="width: 255px;" value="${leaveVersion.fUserName}" />
</div>
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">部 门:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fDept" id="fDept" readOnly="true" style="width: 100%;" value="${leaveVersion.fDept?if_exists}" />
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">  版本号:</label>
<div class="col-sm-3" >
<input type="text" name="leaveVersion.fVersion" id="fVersion" value="${leaveVersion.fVersion?if_exists}" style="width: 100%;" />
<font color="red">*(必填)</font>
</div>
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">发布日期:</label>
<div class="col-sm-3" >
<input class="input" type="date" name="leaveVersion.fOpDt" value=${leaveVersion.fOpDt } id="fOpDt" style="width: 100%;" onmouseout="reckon()" />
<font color="red">*(必填)</font>
</div>
</div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1">版本说明:</label>
<div class="col-sm-8">
<textarea name="leaveVersion.fDesc" id="fDesc" cols="20" rows="5" style="width: 100%; height: 100px;">${leaveVersion.fDesc?if_exists}</textarea>
</div>
</div>
<div class="space-5"></div>
<div class="space-5"></div>
<div class="form-group">
<label class="col-sm-2 control-label no-padding-right" for="form-field-1"> 文件下载:</label>
<div class="col-sm-3" style="width: 260px;" id="files">
<#if fileList??>
<#list fileList as fj>
<a class="col-sm-0 control-label no-padding-right" style="margin-right: 12px;" id="file" name="file" href="version_downLoad.action?leaveFile.fId=${fj.FID?if_exists}" value="${fj.FID?if_exists}">${fj.FNAME?if_exists}</a>
</p>
</a>
</#list>
</#if>
</div>
</div>
<div class="clearfix form-actions">
<label class="col-md-3 col-sm-3 col-xs-3 control-label no-padding-right" for="form-field-1"> </label>
<div class="col-md-6 col-sm-6 col-xs-6 col-md-offset-2" >
<button class="btn btn-default btn-round clo" id="button1">
<i class="ace-icon fa fa-times bigger-110"></i> 关闭
</button>
</div>
</div>
</@s.form>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$((function($) {
$.datepicker.regional['zh-CN'] = {
clearText: '清除',
clearStatus: '清除已选日期',
closeText: '关闭',
closeStatus: '不改变当前选择',
prevText: '<上月',
prevStatus: '显示上月',
prevBigText: '<<',
prevBigStatus: '显示上一年',
nextText: '下月>',
nextStatus: '显示下月',
nextBigText: '>>',
nextBigStatus: '显示下一年',
currentText: '今天',
currentStatus: '显示本月',
monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月',
'九月', '十月', '十一月', '十二月'
],
monthNamesShort: ['一', '二', '三', '四', '五', '六', '七', '八',
'九', '十', '十一', '十二'
],
monthStatus: '选择月份',
yearStatus: '选择年份',
weekHeader: '周',
weekStatus: '年内周次',
dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
dayNamesMin: ['日', '一', '二', '三', '四', '五', '六'],
dayStatus: '设置 DD 为一周起始',
dateStatus: '选择 m月 d日, DD',
dateFormat: 'yy-mm-dd',
firstDay: 1,
initStatus: '请选择日期',
isRTL: false
};
$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
})(jQuery));
$('.datePicker').datepicker();
</script>
</body>
</html>
java代码方面
至于怎么配置struts还有spring,hibernate 之间配置我这里不详细讲了
action
package com.jlrdm.qj.action;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.bo.LeaveVersion;
import com.jlrdm.qj.bo.UploadInfo;
import com.jlrdm.qj.core.util.FileManageUtil;
import com.jlrdm.qj.service.LeaveFileService;
import com.jlrdm.qj.service.LeaveVersionService;
import com.ky.core.action.bean.JsonBean;
import com.ky.sys.action.SysMainAction;
import com.ky.sys.bo.User;
import com.ky.sys.bo.UserProperty;
import com.ky.sys.context.UserContext;
import com.ky.sys.exception.AclException;
import com.ky.sys.service.IUserService;
import com.ky.sys.shiro.SecurityUtils;
public class LeaveVersionAction extends SysMainAction {
private LeaveVersion leaveVersion;
private IUserService userService;
private List<Map<String, Object>> listVersion;
private LeaveVersionService leaveVersionService;
private List<String> fileFileName;
private List<File> file;
private InputStream fileInput;
private String fileContentType[];
private String furl[];
private LeaveFile leaveFile;
private LeaveFileService leaveFileService;
public FileManageUtil fileManageUtil;
private List<Map<String, Object>> fileList;
private String fileId;
public String execute() throws Exception {
return "SUCCESS";
}
public String query() {
return "query";
}
/**
* 分页查询
* @return
*/
public String queryPage() {
if (leaveVersion == null) {
leaveVersion = new LeaveVersion();
}
listVersion = getList(leaveVersion);
total = leaveVersionService.queryCount(leaveVersion);
return "queryPage";
}
/***
* 方法描述:得到列表集合
* @param leaveVersion2 查询的参数
* @return List集合
*/
public List<Map<String, Object>> getList(LeaveVersion leaveVersion) {
if (leaveVersion == null) {
leaveVersion = new LeaveVersion();
}
List<Map<String, Object>> strVersion = leaveVersionService.queryPage(
leaveVersion, getStartPos(), getPageSize());
return strVersion;
}
/**
*
* 方法描述:跳转到新增页面
*
* @return
*/
public String addUI() {
// 获取用户 部门
User user = userService
.findUserById(UserContext.getLoginUser().getId());
List<Map<String, Object>> deptAndPost;
if (leaveVersion == null) {
leaveVersion = new LeaveVersion();
}
if (user != null && user.getId() != null && !"".equals(user.getId())) {
deptAndPost = leaveVersionService
.getDeptAndGWByUserId(user.getId());
leaveVersion.setfUserName(user.getId());
leaveVersion.setfName(user.getName());
if (deptAndPost != null && deptAndPost.size() > 0) {
leaveVersion.setfDept(deptAndPost.get(0).get("DEPTNAME")
.toString());
}
}
return "addUI";
}
/**
*
* 方法描述:保存新增
*
* @return
*/
public String add() throws IOException, ServletException {
List<UploadInfo> fileInfos = null;
Integer fdiseq = leaveVersionService.addVersion(leaveVersion);
if (file != null && !file.isEmpty()) {
try {
fileInfos = FileManageUtil.FilesUpload(file, fileFileName,
"/download/");
} catch (Exception e) {
jsonBean = new JsonBean("300", "上传失败!");
System.out.println(e.getMessage());
}
if (fileInfos != null && !fileInfos.isEmpty()) {
for (int i = 0; i < fileInfos.size(); i++) {
LeaveFile leaveFile = new LeaveFile();
leaveFile.setFifvalid("1");
leaveFile.setFurl(fileInfos.get(i).getFilePath());
leaveFile.setfName(fileInfos.get(i).getUploadFileName());
leaveFile.setfDiseq(leaveVersion.getfDiseq());
leaveFileService.addFile(leaveFile);
}
jsonBean = new JsonBean("200", "上传成功!");
} else {
jsonBean = new JsonBean("300", "上传失败!");
}
}
jsonBean = new JsonBean("200", "保存成功!");
return "SUCCESS";
}
/**
*
* 方法描述:删除
* 先获取
* @return
*/
public String delete() {
int fidesq=leaveVersion.getfDiseq();
leaveVersionService.delete(leaveVersion.getfDiseq());
fileList = leaveFileService.selectFile(fidesq);
System.out.println(fileList.size());
if(fileList.size()>0){
leaveFileService.deleteFileByFdiseq(fidesq);
for(int i=0;i<fileList.size();i++){
FileManageUtil.delFile(fileList.get(i).get("FURL").toString());
}
}
jsonBean = new JsonBean("200", "删除成功!");
return "SUCCESS";
}
/**
* 方法描述:跳转到编辑页面
* @return
*
*/
public String editUI() {
if (leaveVersion != null
&& StringUtils.isNotBlank(leaveVersion.getfDiseq() + "")) {
User loginUser = (User) SecurityUtils.getSubject().getPrincipal();
UserProperty userProperty = userService
.findUserProByUserId(loginUser.getId());
User user2 = new User();
user2.setEnabled(true);
leaveVersion = leaveVersionService.findObjectById(leaveVersion
.getfDiseq());
fileList = leaveFileService.selectFile(leaveVersion.getfDiseq());
}
return "editUI";
}
/**
* 方法描述:保存编辑
* @return
*/
public String edit() {
try {
if (leaveVersion != null) {
leaveVersionService.update(leaveVersion);
// 进入文件上传方法之前判断是否存在新增文件
if(file!=null){
editFileUplod();
}
jsonBean = new JsonBean("200", "保存成功!");
} else {
jsonBean = new JsonBean("300", "保存失败!");
}
} catch (AclException e) {
jsonBean = new JsonBean("300", "保存失败!");
e.printStackTrace();
}
return "SUCCESS";
}
/**
* 在编辑页面附件上传
* @return
*/
public String editFileUplod() {
// 上传
List<UploadInfo> fileInfos = null;
if (file.size() > 0 && file !=null) {
try {
fileInfos = FileManageUtil.FilesUpload(file, fileFileName,
"/download/");
} catch (Exception e) {
jsonBean = new JsonBean("300", "上传失败!");
System.out.println(e.getMessage());
}
if (fileInfos != null && !fileInfos.isEmpty()) {
for (int i = 0; i < fileInfos.size(); i++) {
LeaveFile leaveFile = new LeaveFile();
leaveFile.setFifvalid("1");
leaveFile.setFurl(fileInfos.get(i).getFilePath());
leaveFile.setfName(fileInfos.get(i).getUploadFileName());
leaveFile.setfDiseq(leaveVersion.getfDiseq());
leaveFileService.addFile(leaveFile);
}
jsonBean = new JsonBean("200", "上传成功!");
} else {
jsonBean = new JsonBean("300", "上传失败!");
}
}
return "SUCCESS";
}
/**
* 附件删除
* @param fileId
*/
public String deleteFile() {
if (!StringUtils.isEmpty(fileId)) {
jsonBean = new JsonBean("300", "删除失败!");
List<Map<String, Object>> fj = leaveFileService
.findFileById(fileId);
if (fj != null) {
if (leaveFileService.deleteFileById(fileId)) {
FileManageUtil.delFile(fj.get(0).get("FURL").toString());
jsonBean = new JsonBean("200", "删除成功!");
}
}
}
return "SUCCESS";
}
/**
* 附件下载
*/
public String downLoad() throws Exception {
if (leaveFile != null
&& StringUtils.isNotBlank(leaveFile.getfId() + "")) {
List<Map<String, Object>> fj = leaveFileService.findFileById(leaveFile.fId);
FileManageUtil.doDownLoad(fj.get(0).get("FURL").toString(),
fj.get(0).get("FNAME").toString(),
ServletActionContext.getResponse());
}
return "SUCCESS";
}
/**
*
* 方法描述:详情页面
*
* @return
*/
public String detail() {
if (leaveVersion != null
&& StringUtils.isNotBlank(leaveVersion.getfDiseq() + "")) {
User loginUser = (User) SecurityUtils.getSubject().getPrincipal();
UserProperty userProperty = userService
.findUserProByUserId(loginUser.getId());
User user2 = new User();
user2.setEnabled(true);
leaveVersion = leaveVersionService.findObjectById(leaveVersion
.getfDiseq());
fileList = leaveFileService.selectFile(leaveVersion.getfDiseq());
System.out.println("leaveVersion.toString()"
+ leaveVersion.toString());
}
return "detail";
}
/*
*这里对set和get方法省去
*/
}
LeaveFileService
package com.jlrdm.qj.service;
import java.util.List;
import java.util.Map;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.core.service.BaseService;
public interface LeaveFileService extends BaseService<LeaveFile>{
/**
* 根据加附件
* @param
* @return
*/
public void addFile(LeaveFile leaveFile);
/**
* 根据fdiseq查询附件数据
* @param
* @return
*/
public List<Map<String, Object>> selectFile(Integer integer);
/**
* 根据查找附件
* @param
* @return
*/
public List<Map<String, Object>> findFileById(String fId);
/**
* 根据删除附件
* @param
* @return
*/
public boolean deleteFileById(String fId);
/**
* 根据fdiseq删除数据
* @param
* @return
*/
public void deleteFileByFdiseq(int fidesq);
}
LeaveVersionService
package com.jlrdm.qj.service;
import java.util.List;
import java.util.Map;
import com.jlrdm.qj.bo.LeaveVersion;
import com.jlrdm.qj.core.service.BaseService;
public interface LeaveVersionService extends BaseService<LeaveVersion>{
//分页查询
List<Map<String, Object>> queryPage(LeaveVersion temp, int startPos,
int pageSize);
//统计
int queryCount(LeaveVersion leaveVersion);
/**
* 查询当前用户所属部门和岗位
* @param userId 用户编号
* @return
*/
List<Map<String, Object>> getDeptAndGWByUserId(String id);
//返回主键
public Integer addVersion(LeaveVersion leaveVersion);
}
LeaveFileServiceImpl
package com.jlrdm.qj.service.impl;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.core.service.impl.BaseServiceImpl;
import com.jlrdm.qj.core.util.QueryHelper;
import com.jlrdm.qj.dao.LeaveFileDao;
import com.jlrdm.qj.service.LeaveFileService;
public class LeaveFileServiceImpl extends BaseServiceImpl<LeaveFile> implements
LeaveFileService {
private LeaveFileDao leaveFileDao;
/**
* 查询新增附件
* @param userId 用户编号
* @return
*/
@Override
public void addFile(LeaveFile leaveFile) {
leaveFileDao.addFile(leaveFile);
}
/**
* 查询编辑页面附件
* @param
* @return
*/
@Override
public List<Map<String, Object>> selectFile(Integer fDiseq) {
return leaveFileDao.selectFile(fDiseq);
}
/**
* 查询单个附件
* @param
* @return
*/
public List<Map<String, Object>> findFileById(String fId) {
return leaveFileDao.findFileById(fId);
}
/**
* 删除单个附件
* @param
* @return
*/
public boolean deleteFileById(String fId) {
return leaveFileDao.deleteFileById(fId);
}
/**
* 删除单个附件
* @param
* @return
*/
public void deleteFileByFdiseq(int fidesq) {
leaveFileDao.deleteFileByFdiseq(fidesq);
}
public LeaveFileDao getLeaveFileDao() {
return leaveFileDao;
}
public void setLeaveFileDao(LeaveFileDao leaveFileDao) {
this.leaveFileDao = leaveFileDao;
}
}
LeaveVersionServiceImpl
package com.jlrdm.qj.service.impl;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.core.service.impl.BaseServiceImpl;
import com.jlrdm.qj.core.util.QueryHelper;
import com.jlrdm.qj.dao.LeaveFileDao;
import com.jlrdm.qj.service.LeaveFileService;
public class LeaveFileServiceImpl extends BaseServiceImpl<LeaveFile> implements
LeaveFileService {
private LeaveFileDao leaveFileDao;
/**
* 查询新增附件
* @param userId 用户编号
* @return
*/
@Override
public void addFile(LeaveFile leaveFile) {
leaveFileDao.addFile(leaveFile);
}
/**
* 查询编辑页面附件
* @param
* @return
*/
@Override
public List<Map<String, Object>> selectFile(Integer fDiseq) {
return leaveFileDao.selectFile(fDiseq);
}
/**
* 查询单个附件
* @param
* @return
*/
public List<Map<String, Object>> findFileById(String fId) {
return leaveFileDao.findFileById(fId);
}
/**
* 删除单个附件
* @param
* @return
*/
public boolean deleteFileById(String fId) {
return leaveFileDao.deleteFileById(fId);
}
/**
* 删除单个附件
* @param
* @return
*/
public void deleteFileByFdiseq(int fidesq) {
leaveFileDao.deleteFileByFdiseq(fidesq);
}
public LeaveFileDao getLeaveFileDao() {
return leaveFileDao;
}
public void setLeaveFileDao(LeaveFileDao leaveFileDao) {
this.leaveFileDao = leaveFileDao;
}
}
LeaveVersionDao
package com.jlrdm.qj.dao;
import java.util.List;
import java.util.Map;
import com.jlrdm.qj.bo.LeaveItem;
import com.jlrdm.qj.bo.LeaveVersion;
import com.jlrdm.qj.core.dao.BaseDao;
public interface LeaveVersionDao extends BaseDao<LeaveVersion>{
List<Map<String, Object>> queryPage(LeaveVersion temp, int startPos,
int pageSize);
int queryPage(LeaveVersion leaveVersion);
/**
* 查询当前用户所属部门和岗位
* @param userId 用户编号
* @return
*/
public List<Map<String, Object>> queryDeptAndGWByUserId(String userId);
//插入数据并返回主键
public Integer addVersion(LeaveVersion leaveVersion);
}
LeaveFileDaoImpl
package com.jlrdm.qj.dao.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.jlrdm.qj.bo.LeaveDictionary;
import com.jlrdm.qj.bo.LeaveFile;
import com.jlrdm.qj.bo.LeaveVersion;
import com.jlrdm.qj.core.dao.impl.BaseDaoImpl;
import com.jlrdm.qj.core.util.QueryHelper;
import com.jlrdm.qj.dao.LeaveFileDao;
import com.jlrdm.qj.dao.LeaveVersionDao;
public class LeaveFileDaoImpl extends BaseDaoImpl<LeaveFile> implements LeaveFileDao {
/**
* 查询新增附件
* @param userId 用户编号
* @return
*/
public void addFile(LeaveFile leaveFile){
this.getHibernateTemplate().save(leaveFile);
}
/**
* 查询查询编辑页面附件
* @param
* @return
* @return
*/
public List<Map<String, Object>> selectFile(Integer fDiseq){
String sql = "SELECT * FROM T_FILE WHERE FDISEQ ='"+fDiseq+"'";
return findByNativeSQL(sql, null, null, 0, -1);
}
/**
* 查询单个附件
* @param
* @return
* @return
*/
public List<Map<String, Object>> findFileById(String FID){
String sql = "SELECT FID,FDISEQ,FNAME,FIFVALID,FKBSIZE,FURL FROM T_FILE WHERE FID ='"+FID+"'";
return super.findByNativeSQL(sql, null, 0, -1);
}
/**
* 删除单个附件
* @param
* @return
* @return
*/
public boolean deleteFileById(String fId){
String sql = "delete from LeaveFile WHERE fId ='"+fId+"'";
this.delete(sql);
return true;
}
/**
* 根据fdiseq删除附件
* @param
* @return
*/
public void deleteFileByFdiseq(int fdiseq){
String sql = "delete from LeaveFile WHERE fdiseq ='"+fdiseq+"'";
this.delete(sql);
}
}
LeaveVersionDaoImpl
package com.jlrdm.qj.dao.impl;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.jlrdm.qj.bo.LeaveDictionary;
import com.jlrdm.qj.bo.LeaveVersion;
import com.jlrdm.qj.core.dao.impl.BaseDaoImpl;
import com.jlrdm.qj.core.util.QueryHelper;
import com.jlrdm.qj.dao.LeaveVersionDao;
public class LeaveVersionDaoImpl extends BaseDaoImpl implements LeaveVersionDao {
/**
* 查询分页
* @param
* @return
*/
@Override
public List<Map<String, Object>> queryPage(LeaveVersion leaveVersion, int startPos,int size) {
StringBuffer strFrom = new StringBuffer();
strFrom.append("select * from t_versionManage where 1=1");
if (leaveVersion.getfName() != null) {
strFrom.append(" and fname like'" +"%"+ leaveVersion.getfName() + "%'");
}
if (leaveVersion.getfResName() != null) {
strFrom.append(" and fresname like'" +"%"+ leaveVersion.getfResName() + "%'");
}
strFrom.append(" order by fdiseq desc");
return super.findByNativeSQL(strFrom.toString(), null,startPos, size);
}
/**
* 查询分页
* @param
* @return
*/
@Override
public int queryPage(LeaveVersion leaveVersion) {
StringBuffer strFrom = new StringBuffer();
strFrom.append("select count(*) from t_versionManage where 1=1");
if (leaveVersion.getfName() != null) {
strFrom.append(" and fname like'" +"%"+ leaveVersion.getfName() + "%'");
}
if (leaveVersion.getfResName() != null) {
strFrom.append(" and fresname like'" +"%"+ leaveVersion.getfResName() + "%'");
}
strFrom.append(" order by fdiseq desc");
return super.findCountByNativeSQL(strFrom.toString());
}
/**
* 查询当前用户所属部门和岗位
* @param userId 用户编号
* @return
*/
@Override
public List<Map<String, Object>> queryDeptAndGWByUserId(String userId) {
String sql = "select (select mc from drsyb_res.kyres_sjdm where dmfl_id = '1'"
+ " and dm = c.SHARE_DEPARTMENT) deptName,"
+ " (select dm from drsyb_res.kyres_sjdm"
+ " where dmfl_id = '1' and dm = c.SHARE_DEPARTMENT) deptId,"
+ " (select mc from drsyb_res.kyres_sjdm"
+ " where dmfl_id = 'GW' and dm = c.JOB) post"
+ " from drsyb_res.ACL_USER_PROPERTY c "
+ " where c.user_id = '" + userId + "'";
return super.findByNativeSQL(sql, null, 0, -1);
}
/**
* 插入并返回主键
* @param userId 用户编号
* @return
*/
public Integer addVersion(LeaveVersion leaveVersion){
return (Integer) this.getHibernateTemplate().save(leaveVersion);
}
}
LeaveFile
package com.jlrdm.qj.bo;
public class LeaveFile {
public String fId;// 主键
public Integer fSeq;// 内部序号
public String fName;// 附件名称(文件名)
public Float fKbsize;
public Integer fDiseq;// 详细资料序号(外键)
public String fifvalid;// 是否有效
public String furl;// 路劲
//private LeaveVersion leaveVersion;
public String getFurl() {
return furl;
}
public void setFurl(String furl) {
this.furl = furl;
}
/*public LeaveVersion getLeaveVersion() {
return leaveVersion;
}
public void setLeaveVersion(LeaveVersion leaveVersion) {
this.leaveVersion = leaveVersion;
}*/
public Integer getfDiseq() {
return fDiseq;
}
public void setfDiseq(Integer fDiseq) {
this.fDiseq = fDiseq;
}
public String getfId() {
return fId;
}
public void setfId(String fId) {
this.fId = fId;
}
public Integer getfSeq() {
return fSeq;
}
public void setfSeq(Integer fSeq) {
this.fSeq = fSeq;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public Float getfKbsize() {
return fKbsize;
}
public void setfKbsize(Float fKbsize) {
this.fKbsize = fKbsize;
}
public String getFifvalid() {
return fifvalid;
}
public void setFifvalid(String fifvalid) {
this.fifvalid = fifvalid;
}
@Override
public String toString() {
return "LeaveFile [fId=" + fId + ", fSeq=" + fSeq + ", fName=" + fName
+ ", fKbsize=" + fKbsize + ", fDiseq=" + fDiseq + ", fifvalid="
+ fifvalid + ", furl=" + furl + "]";
}
}
LeaveVersion
package com.jlrdm.qj.bo;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class LeaveVersion {
public Integer fDiseq;//--序号
public String fResName;//项目名称
public String fDesc;//说明
public String fVersion;//版本号
public String fName;//发布人姓名
public String fUserName;//发布人id
public String fDept;//发布人部门号
public Date fOpDt;//发布日期
//private Set<LeaveFile> leaveFile = new HashSet<LeaveFile>();
//public LeaveFile leaveFile;
public Integer getfDiseq() {
return fDiseq;
}
public void setfDiseq(Integer fDiseq) {
this.fDiseq = fDiseq;
}
public String getfResName() {
return fResName;
}
public void setfResName(String fResName) {
this.fResName = fResName;
}
public String getfDesc() {
return fDesc;
}
public void setfDesc(String fDesc) {
this.fDesc = fDesc;
}
public String getfVersion() {
return fVersion;
}
public void setfVersion(String fVersion) {
this.fVersion = fVersion;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getfUserName() {
return fUserName;
}
public void setfUserName(String fUserName) {
this.fUserName = fUserName;
}
public String getfDept() {
return fDept;
}
public void setfDept(String fDept) {
this.fDept = fDept;
}
public Date getfOpDt() {
return fOpDt;
}
public void setfOpDt(Date fOpDt) {
this.fOpDt = fOpDt;
}
}
uploadInfo
package com.jlrdm.qj.bo;
import java.io.File;
import java.util.Arrays;
public class UploadInfo {
/** 上传的文件 */
private File file;
/** 相对路径 */
private String absolutePath;
/** 绝对路径 */
private String RealPath;
/** 上传文件名 */
private String uploadFileName;
/** 文件后缀 */
private String fileSuffix;
/** 文件别名 上传到tomcat的别名 */
private String targetFileName;
/** 文件路径 (相对路径+文件别名)*/
private String filePath;
/** 上传文件大小 */
private String fileSize;
/** 文件流转成byte,用于存储blob字段 */
private byte[] fileByte;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getAbsolutePath() {
return absolutePath;
}
public void setAbsolutePath(String absolutePath) {
this.absolutePath = absolutePath;
}
public String getRealPath() {
return RealPath;
}
public void setRealPath(String realPath) {
RealPath = realPath;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getFileSuffix() {
return fileSuffix;
}
public void setFileSuffix(String fileSuffix) {
this.fileSuffix = fileSuffix;
}
public String getTargetFileName() {
return targetFileName;
}
public void setTargetFileName(String targetFileName) {
this.targetFileName = targetFileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileSize() {
return fileSize;
}
public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
public byte[] getFileByte() {
return fileByte;
}
public void setFileByte(byte[] fileByte) {
this.fileByte = fileByte;
}
@Override
public String toString() {
return "UploadInfo [file=" + file + ", absolutePath=" + absolutePath
+ ", RealPath=" + RealPath + ", uploadFileName="
+ uploadFileName + ", fileSuffix=" + fileSuffix
+ ", targetFileName=" + targetFileName + ", filePath="
+ filePath + ", fileSize=" + fileSize + ", fileByte="
+ Arrays.toString(fileByte) + "]";
}
}
LeaveFile.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.jlrdm.qj.bo.LeaveFile" table="T_FILE">
<id name="fId" type="java.lang.String">
<column name="FID" />
<generator class="uuid.hex" />
</id>
<property name="fSeq" type="java.lang.Integer" column="FSEQ"></property>
<property name="fName" type="java.lang.String">
<column name="FNAME">
</column>
</property>
<!-- <many-to-one name="checker" column="CHECKER" class="com.ky.sys.bo.User"
/> -->
<property name="fKbsize" type="java.lang.Integer" column="FKBSIZE"></property>
<property name="furl" type="java.lang.String">
<column name="FURL">
</column>
</property>
<!-- <property name="fDiseq" type="java.lang.Integer">
<column name="FDISEQ">
</column>
</property> -->
<!-- <many-to-one name="fDiseq" class="com.jlrdm.qj.bo.LeaveVersion" column="FDISEQ"
/> -->
<property name="fDiseq" type="java.lang.Integer">
<column name="FDISEQ">
</column>
</property>
<!-- <one-to-one name="fDiseq" class="com.jlrdm.qj.bo.LeaveVersion" column="FDISEQ"
cascade="save-update"></one-to-one> -->
<property name="fifvalid" type="java.lang.String">
<column name="FIFVALID" />
</property>
</class>
</hibernate-mapping>
LeaveVersion.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.jlrdm.qj.bo.LeaveVersion" table="T_VERSIONMANAGE">
<id name="fDiseq" type="java.lang.Integer">
<column name="FDISEQ" precision="10" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_VERSION</param>
</generator>
</id>
<!-- <set name="leaveFile" cascade="all-delete-orphan"> <key column="fdiseq"></key>
<one-to-many class="com.jlrdm.qj.bo.LeaveFile"/> </set> -->
<property name="fResName" type="java.lang.String" column="FRESNAME"></property>
<property name="fDesc" type="java.lang.String">
<column name="FDESC">
</column>
</property>
<!-- <many-to-one name="checker" column="CHECKER" class="com.ky.sys.bo.User"
/> -->
<property name="fVersion" type="java.lang.String" column="FVERSION"></property>
<property name="fName" type="java.lang.String">
<column name="FNAME">
</column>
</property>
<property name="fUserName" type="java.lang.String">
<column name="FUSERNAME" />
</property>
<property name="fDept" type="java.lang.String">
<column name="FDEPT" />
</property>
<property name="fOpDt" type="java.util.Date">
<column name="FOPDT" />
</property>
<!-- <set name="leaveFile" cascade="delete">
<key column="FDISEQ"></key>
<one-to-many class="com.jlrdm.qj.bo.LeaveFile"/>
</set>-->
</class>
</hibernate-mapping>
文件工具类FileManageUtil
package com.jlrdm.qj.core.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import com.jlrdm.qj.bo.UploadInfo;
import com.ky.core.id.generator.ObjectId;
import com.ky.sys.exception.AclException;
import com.opensymphony.xwork2.ActionContext;
/**
*
* 类名称:FileManageUtil
* JIRA:http://192.168.0.234/browse/TODO
* 类描述:文件管理工具类 包括上传下载等
*
* 创建人: jmy
* 创建时间:2018年8月17日 下午3:41:07
*
* @author jmy
* @date 2018年8月17日 下午3:41:07
* @jira http://192.168.0.234/browse/TODO
* @updateRemark 修改备注:创建
*
*/
public class FileManageUtil {
private static final Log log = LogFactory.getLog(FileManageUtil.class);
/*********************** 接口定义 ***********************/
/*********************** 变量定义 ***********************/
/*********************** 实体定义 ***********************/
/*********************** list定义 ***********************/
/**
*
* 方法描述:上传单个文件
*
* @param upload 上传的文件
* @param uploadFileName 上传的文件名
* @param absolutePath 相对路径
* @return Map<String, Object> uploadInfo
* @author jmy
* @date 2018.8.30
*/
public static UploadInfo FileUpload (File upload, String uploadFileName, String absolutePath){
UploadInfo uploadInfo = new UploadInfo();
if(null != upload){
String realPath = ServletActionContext.getServletContext().getRealPath(absolutePath);// 文件上传绝对路径
File file =new File(realPath);
if(!file.exists()){
file.mkdirs();
}
String fileSuffix = uploadFileName.substring(uploadFileName.lastIndexOf(".")); //文件后缀
// 重新编辑文件名,防止上传的文件重名,用于以后删除文件
ObjectId objectId = new ObjectId();
String objId = objectId.toHexString();
String targetFileName = objId + fileSuffix; // 文件别名
File target = new File(realPath, targetFileName);
try {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(upload);
output = new FileOutputStream(target);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buf)) > 0) {
output.write(buf, 0, bytesRead);
}
} finally {
input.close();
output.close();
}
} catch (IOException e) {
System.out.println("上传出错:"+e);
e.printStackTrace();
}
uploadInfo.setFile(upload);
uploadInfo.setAbsolutePath(absolutePath);
uploadInfo.setRealPath(realPath);
uploadInfo.setUploadFileName(uploadFileName);
uploadInfo.setFileSuffix(fileSuffix);
uploadInfo.setFilePath(absolutePath+targetFileName);
uploadInfo.setFileSize(checkFileSize(upload.length()));
}
return uploadInfo;
}
/**
*
* 方法描述:上传多个文件
*
* @param uploads 上传的文件列表
* @param uploadsFileName 上传的文件名列表
* @param absolutePath 相对路径
* @return List<UploadInfo> uploadInfoList 上传文件信息列表
* @author jmy
* @date 2018.8.30
*/
public static List<UploadInfo> FilesUpload (List<File> uploads, List<String> uploadsFileName, String absolutePath){
List<UploadInfo> uploadInfoList = new ArrayList<UploadInfo>();
if(null != uploads && uploads.size()>0){
for(int i = 0; i < uploads.size(); i++){
UploadInfo uploadInfo = new UploadInfo();
uploadInfo = FileUpload(uploads.get(i), uploadsFileName.get(i), absolutePath);
uploadInfoList.add(uploadInfo);
}
}
return uploadInfoList;
}
/**
*
* 方法描述:判断文件大小
*
* @param fileSize
* @return
* @author jmy
* @date 2018.8.30
*/
public static String checkFileSize(long fileSize) {
// 如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
double value = (double) fileSize;
if (value < 1024) {
return String.valueOf(value) + "B";
} else {
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
// 如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
// 因为还没有到达要使用另一个单位的时候
// 接下去以此类推
if (value < 1024) {
return String.valueOf(value) + "KB";
} else {
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
}
if (value < 1024) {
return String.valueOf(value) + "MB";
} else {
// 否则如果要以GB为单位的,先除于1024再作同样的处理
value = new BigDecimal(value / 1024).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
return String.valueOf(value) + "GB";
}
}
/**
*
* 方法描述:文件下载
*
* @param path
* @param name
* @param response
* @return
* @author lihaoqian
* @date 2018.8.31
*/
public static void doDownLoad(String path, String name,HttpServletResponse response) {
ServletContext sc = (ServletContext) ActionContext.getContext().get(
ServletActionContext.SERVLET_CONTEXT);
try {
response.reset();
response.setHeader("Content-disposition","attachment;success=true;filename ="
+ URLEncoder.encode(name, "utf-8"));
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = null;
InputStream fis = null;
File uploadFile = new File(sc.getRealPath(path));
fis = new FileInputStream(uploadFile);
bis = new BufferedInputStream(fis);
fos = response.getOutputStream();
bos = new BufferedOutputStream(fos);
// 弹出下载对话框
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = bis.read(buffer, 0, 8192)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* 方法描述:单个文件流转成普通流
*
* @param file 文件流
* @return InputStream 普通流
*/
public static InputStream fileToInputStream(File file){
InputStream input = null;
try {
input = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return input;
}
/**
*
* 方法描述:将file转成byte
*
* @param upload
* @return
* @throws IOException
*/
@SuppressWarnings("resource")
public static byte[] fileToByte(File upload) throws IOException{
byte[] e = null;
FileInputStream fi = null;
if(upload != null) {
fi = new FileInputStream(upload);
e = new byte[fi.available()];
fi.read(e);
}
return e;
}
/**
*
* 方法描述:上传单个文件存储成BLOB
*
* @param upload 上传的文件
* @param uploadFileName 上传的文件名
* @return Map<String, Object> uploadInfo
* @author jmy
* @throws IOException
* @date 2018.8.30
*/
public static UploadInfo FileUploadToBLOB (File upload, String uploadFileName) throws IOException{
UploadInfo uploadInfo = new UploadInfo();
if(null != upload){
// 1.1、文件后缀
String fileSuffix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
// 1.2、重新编辑文件名,防止上传的文件重名,用于以后删除文件(文件别名)
ObjectId objectId = new ObjectId();
String objId = objectId.toHexString();
String targetFileName = objId + fileSuffix;
// 1.3、将文件流转成byte
byte[] fileByte = fileToByte(upload);
uploadInfo.setFile(upload);
uploadInfo.setUploadFileName(uploadFileName);
uploadInfo.setFileSuffix(fileSuffix);
uploadInfo.setTargetFileName(targetFileName);
uploadInfo.setFileSize(checkFileSize(upload.length()));
uploadInfo.setFileByte(fileByte);
}
return uploadInfo;
}
/**
*
* 方法描述:上传多个文件
*
* @param uploads 上传的文件列表
* @param uploadsFileName 上传的文件名列表
* @return List<UploadInfo> uploadInfoList 上传文件信息列表
* @throws IOException
* @author jmy
* @date 2018.8.30
*/
public static List<UploadInfo> FileUploadToBLOBs (List<File> uploads, List<String> uploadsFileName) throws IOException{
List<UploadInfo> uploadInfoList = new ArrayList<UploadInfo>();
if(null != uploads && uploads.size()>0){
for(int i = 0; i < uploads.size(); i++){
UploadInfo uploadInfo = new UploadInfo();
uploadInfo = FileUploadToBLOB(uploads.get(i), uploadsFileName.get(i));
uploadInfoList.add(uploadInfo);
}
}
return uploadInfoList;
}
public static void doDownLoadBLOB(byte[] fileByte, String fileName){
HttpServletResponse response = ServletActionContext.getResponse();
try {
// 以流的形式下载文件
response.reset();
response.setHeader("Content-disposition","attachment;success=true;filename =" + URLEncoder.encode(fileName, "utf-8"));
response.setCharacterEncoding("UTF-8");
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
toClient.write(fileByte);
toClient.flush();
toClient.close();
} catch (Exception e) {
if (log.isErrorEnabled()) {
log.error("下载BLOB文件失败!", e);
}throw new AclException("下载BLOB文件失败!", e);
}
}
/**
*
* 方法描述:文件删除
*
* @param path
* @param name
* @param response
* @return
* @author xao
* @date 2018.8.31
*/
public static boolean delFile(String path) {
ServletContext sc = (ServletContext) ActionContext.getContext().get(
ServletActionContext.SERVLET_CONTEXT);
try {
File uploadFile = new File(sc.getRealPath(path));
return uploadFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}