要使用Spring-MVC框架实现文件的上传、修改、下载,代码到不是很多,只是需要多个类来实现,这里使用我所写过的项目里的Version实体来说明-->
首先看一下数据库里的表Versions字段:(waraddress、sqladdress就是要上传的文件真实名字,warrealname、sqlrealname是上传前的文件名字)
id 系统类型id , waraddress war包地址,sqladdress ,sql脚本地址 ,descr 说明 , warrealname war包源名, sqlrealname sql脚本源名, svnaddress 软件svn地址 , vername 版本名称 , verno 版本号
最基础的实体类:Version类最简单就不看了
DAO层:VersionMapper类--》部分代码
//用于修改记录,注意这里更新的字段里没有文件的名字waraddress 、sqlrealname 、sqladdress 、warrealname
@Update("UPDATE versions SET typeid=#{typeid},descr=#{descr},vername=#{vername},svnaddress=#{svnaddress},verno=#{verno} WHERE id=#{id}")
void updateVersion(Version version);
//用户插入记录
void addVersion(Version version);
//修改上传的war类文件名
@Update("UPDATE versions SET waraddress=#{waraddress},warrealname=#{warrealname} where id=#{id}")
void updateVersionWaraddress(Version version);
//修改上传的sql类文件名
@Update("UPDATE versions SET sqladdress=#{sqladdress},sqlrealname=#{sqlrealname} where id=#{id}")
void updateVersionSqladdress(Version version);
Service服务层:VersionService类--》部分代码
void updateVersion(Version version);
void addVersion(Version version);
void updateVersionWaraddress(Version version);
void updateVersionSqladdress(Version version);
Service服务层:VersionServiceImp类--》部分代码
@Autowired
VersionMapper versionMapper;
@Override
public void updateVersion(Version version) {
versionMapper.updateVersion(version);
}
@Override
public void addVersion(Version version) {
versionMapper.addVersion(version);
}
@Override
public void updateVersionWaraddress(Version version) {
versionMapper.updateVersionWaraddress(version);
}
@Override
public void updateVersionSqladdress(Version version) {
versionMapper.updateVersionSqladdress(version);
}
最重要的Controller控制层:VersionController类--》部分代码
@RequestMapping(value = "/version_add")
public String versionAdd(ModelMap model, Version version, HttpServletRequest request, @RequestParam MultipartFile[] myfiles){
Long id = version.getId();
Version version2 = versionService.loadVersionById(id);
if (id != null) {
//修改记录
versionService.updateVersion(version);
}else {
//增加记录
versionService.addVersion(version);
}
//获取文件保存的路径
String fileDir = request.getSession().getServletContext().getRealPath("resources/file");
//修改前的war、sql文件
File preWarFile = new File(fileDir + File.separator +version2.getWaraddress());
File preSqlFile = new File(fileDir + File.separator +version2.getSqladdress());
//上传、修改文件
for(int i = 0;i < 2;i++){
MultipartFile myfile = myfiles[i];
if(!myfile.isEmpty()){
//真实文件名
String realname = myfile.getOriginalFilename();
String suffix = realname.substring(realname.lastIndexOf("."));
//重命名文件
Long now = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
Long random = (long) (Math.random() * now);
String filename = now + "" + random + suffix.toLowerCase();
if(i == 0){
version.setWaraddress(filename);
version.setWarrealname(realname);
//更新文件名
versionService.updateVersionWaraddress(version);
//删除修改前的文件
if(preWarFile.exists()){
preWarFile.delete();
}
}
if(i == 1){
version.setSqladdress(filename);
version.setSqlrealname(realname);
//更新文件名
versionService.updateVersionSqladdress(version);
//删除修改前的文件
if(preSqlFile.exists()){
preSqlFile.delete();
}
}
File file = new File(fileDir + File.separator + filename);
try {
//开始上传文件
myfile.transferTo(file);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
}
return "redirect:version_list";
}
View视图层:list.jsp--》部分代码
(在页面直接写文件所在的路径,页面上点击就可以直接下载了)
<td style="text-align: center;"><a href="${root}/resources/file/${version.waraddress}" title="${version.warrealname}">下载</a></td>
<td style="text-align: center;"><a href="${root}/resources/file/${version.sqladdress}" title="${version.sqlrealname}">下载</a></td>
这里上传的文件只是原文件,是没有经过压缩的,当然上传文件的方式是有很多的,若果想要改成上传压缩文件,或者做一些其他的修改,可以参考这里