要使用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>
這裏上傳的文件只是原文件,是沒有經過壓縮的,當然上傳文件的方式是有很多的,若果想要改成上傳壓縮文件,或者做一些其他的修改,可以參考這裏