參考
Spring MVC中上傳文件實例
SpringMVC結合ajaxfileupload.js實現ajax無刷新文件上傳
Spring MVC 文件上傳下載 (FileOperateUtil.java 壓縮,重命名工具類)
controller代碼
@Controller @RequestMapping(value = "/file") public class FileController extends BaseController { /** * 上傳文件 * * @return JSON * @throws Exception */ @ResponseBody @RequestMapping(value = "/upload") public Message upload(HttpServletRequest request, HttpServletResponse response) throws Exception { logBefore(logger, "上傳文件"); Message message = new Message(); PageData pd = new PageData(); pd = this.getPageData(); // 這里實現文件上傳操作用的是commons.io.FileUtils類,它會自動判斷/upload是否存在,不存在會自動創建 String realPath = request.getSession().getServletContext() .getRealPath("/upload/file"); logBefore(logger, "realPath: " + realPath); // 上傳文件的原名(即上傳前的文件名字) String originalFilename = null; // 如果只是上傳一個文件,則只需要MultipartFile類型接收文件即可,而且無需顯式指定@RequestParam注解 // 如果想上傳多個文件,那么這里就要用MultipartFile[]類型來接收文件,並且要指定@RequestParam注解 // 上傳多個文件時,前台表單中的所有<input // type="file"/>的name都應該是file,否則參數里的file無法獲取到所有上傳的文件 MultipartFile file = FileUpload.getMultipartFileByName(request, "file"); if (file.isEmpty()) { message.response = ResponseStatus.FAILED.getStatus(); message.message = "請選擇文件后上傳!"; } else { originalFilename = file.getOriginalFilename(); logBefore(logger, "文件原名: " + originalFilename); logBefore(logger, "文件名稱: " + file.getName()); logBefore(logger, "文件長度: " + file.getSize()); logBefore(logger, "文件類型: " + file.getContentType()); logBefore(logger, "========================================"); try { // 這里不必處理IO流關閉的問題,因為FileUtils.copyInputStreamToFile()方法內部會自動把用到的IO流關掉 // 此處也可以使用Spring提供的MultipartFile.transferTo(File dest)方法實現文件的上傳 FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, originalFilename)); } catch (IOException e) { logBefore(logger, "文件[" + originalFilename + "]上傳失敗,堆棧軌跡如下"); e.printStackTrace(); message.response = ResponseStatus.FAILED.getStatus(); message.message = "出錯,服務器繁忙,請稍后再試。"; } } //System.out.println(request.getContextPath() + "/upload/" + originalFilename); message.response = ResponseStatus.SUCCESS.getStatus(); message.message = "上傳成功!"; return message; } /** * 單條記錄刪除 * * @return JSON * @throws Exception */ @ResponseBody @RequestMapping(value = "/delete") public Message delete() { logBefore(logger, "刪除文件"); PageData pd = new PageData(); Message message = new Message(); String file_id = (String) pd.get("file_id"); // 獲取對應文件名和地址 String filePath = ""; //TODO:刪除本地文件,刪除數據庫記錄 try { pd = this.getPageData(); AccidentService.delete(pd); message.response = ResponseStatus.SUCCESS.getStatus(); message.message = "刪除成功"; } catch (Exception e) { logger.error(e.toString(), e); message.response = ResponseStatus.FAILED.getStatus(); message.message = "出錯,服務器繁忙,請稍后再試。"; } return message; } /** * 獲取數據列表頁 * * @param page * 頁面請求對象 * @return 跳轉頁面 */ @RequestMapping(value = "/list") public ModelAndView list(HttpServletRequest request, Page page) { logBefore(logger, "列表File"); // if(!Jurisdiction.buttonJurisdiction(menuUrl, "cha")){return null;} // //校驗權限 ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); //文件儲存地址 //String realPath = request.getSession().getServletContext() .getRealPath("/upload/file"); //TODO:獲取數據庫文件信息 try { pd = this.getPageData(); mv.setViewName("security/files/file_list"); mv.addObject(Const.SESSION_QX, this.getHC()); // 按鈕權限 } catch (Exception e) { logger.error(e.toString(), e); } return mv; } /** * 下載文件 * * @param page * 頁面請求對象 * @return 跳轉頁面 * @throws IOException */ @RequestMapping(value = "/download") public ResponseEntity<byte[]> download(HttpServletRequest request, HttpServletResponse response, Page page) throws IOException { logBefore(logger, "下載File"); PageData pd = new PageData(); String file_id = (String) pd.get("file_id"); // 獲取對應文件名和地址 String fileName = "1.1.1關於印發《交運集團2016年安全生產工作意見》的通知.doc"; // fileName = "222"; String filePath = request.getServletContext().getRealPath( "/upload/file") + "\\1.doc"; logBefore(logger, "fileName: " + fileName); logBefore(logger, "filePath: " + filePath); File file = new File(filePath); try { fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");// 為了解決中文名稱亂碼問題 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 下載文件 HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", fileName); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); try { return new ResponseEntity<byte[]>( FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } catch (IOException e) { e.printStackTrace(); return null; } } }
其中一個FileUpload類的代碼
package com.jiaoyun.util; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver; /** * 上傳文件 創建人:James 創建時間:2014年12月23日 * * @version */ public class FileUpload { /** * @param file * //文件對象 * @param filePath * //上傳路徑 * @param fileName * //文件名 * @return 文件名 */ public static String fileUp(MultipartFile file, String filePath, String fileName) { String extName = ""; // 擴展名格式: try { if (file.getOriginalFilename().lastIndexOf(".") >= 0) { extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); } copyFile(file.getInputStream(), filePath, fileName + extName).replaceAll("-", ""); } catch (IOException e) { System.out.println(e); } return fileName + extName; } /** * 寫文件到當前目錄的upload目錄中 * * @param in * @param fileName * @throws IOException */ private static String copyFile(InputStream in, String dir, String realName) throws IOException { File file = new File(dir, realName); if (!file.exists()) { if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } file.createNewFile(); } System.out.println(file.getAbsolutePath()); FileUtils.copyInputStreamToFile(in, file); return realName; } /** * @param request * //requst請求 * @param filePath * //上傳路徑 * @param fileName * //文件名 * @return 文件名 * @throws IOException * @throws IllegalStateException */ public static String upload(HttpServletRequest request, String filePath, String fileName) throws IllegalStateException, IOException { String extName = ""; // 擴展名格式: String path = ""; CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 判斷 request 是否有文件上傳,即多部分請求 if (multipartResolver.isMultipart(request)) { // 轉換成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { // 取得上傳文件 MultipartFile file = multiRequest.getFile(iter.next()); if (file != null) { // 取得當前上傳文件的文件名稱 String myFileName = file.getOriginalFilename(); // 如果名稱不為“”,說明該文件存在,否則說明該文件不存在 if (myFileName.trim() != "") { // 重命名上傳后的文件名 if (file.getOriginalFilename().lastIndexOf(".") >= 0) { extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); } // 定義上傳路徑 path = filePath + "/" + fileName + extName; // System.out.println("---------------------"); // System.out.println(path); // System.out.println("---------------------"); File localFile = new File(path); file.transferTo(localFile); } } } } return extName; } /** * @param request * //requst請求 * @param filePath * //上傳路徑 * @param fileName * //文件名 * @return 文件名 * @throws IOException * @throws IllegalStateException */ public static String[] uploadMultiple(HttpServletRequest request, String filePath, String[] fileName) throws IllegalStateException, IOException { String[] extName = new String[fileName.length]; // 擴展名格式: String path = ""; CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 判斷 request 是否有文件上傳,即多部分請求 if (multipartResolver.isMultipart(request)) { // 轉換成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); int i = 0; while (iter.hasNext()) { // 取得上傳文件 MultipartFile file = multiRequest.getFile(iter.next()); if (file != null) { // 取得當前上傳文件的文件名稱 String myFileName = file.getOriginalFilename(); // 如果名稱不為“”,說明該文件存在,否則說明該文件不存在 if (myFileName.trim() != "") { // 重命名上傳后的文件名 if (file.getOriginalFilename().lastIndexOf(".") >= 0) { extName[i] = file.getOriginalFilename() .substring(file.getOriginalFilename().lastIndexOf(".")); } // 定義上傳路徑 fileName[i] = fileName[i].replace(extName[i], ""); path = filePath + "/" + fileName[i] + extName[i]; // path = fileName[i] + extName[i]; File localFile = new File(path); file.transferTo(localFile); System.out.println(localFile.getAbsolutePath()); } } i++; } } return extName; } /** * 從request那里得到所有MultipartFile */ public static List<MultipartFile> getMultipartFileFromRequest(HttpServletRequest request) throws IllegalStateException, IOException { List<MultipartFile> fileList = new ArrayList<MultipartFile>(); CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 判斷 request 是否有文件上傳,即多部分請求 if (multipartResolver.isMultipart(request)) { // 轉換成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { MultipartFile file = multiRequest.getFile(iter.next()); System.out.println(file.getName()+"11111111111"); if (file != null && file.getSize() > 0) { fileList.add(file); } } } return fileList; } /** * @Description:刪除文件 */ public static void deleteFile(String bucketName, String key) { return; } public static void deleteFile(String bucketName) { return; } /** * 從request那里得到所有MultipartFile */ public static MultipartFile getMultipartFileByName(HttpServletRequest request,String name) throws Exception { MultipartFile file=null; CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 判斷 request 是否有文件上傳,即多部分請求 if (multipartResolver.isMultipart(request)) { // 轉換成多部分request MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { file = multiRequest.getFile(iter.next()); if (file != null&&file.getName().equals(name)) { return file; } } } return file; } /** * 根據文件得到后綴名 * @param file * @return */ public static String getExtNameByString(String file){ String extName=""; if (file.lastIndexOf(".") >= 0){ extName = file.substring(file.lastIndexOf(".")); } return extName; } public static String getExtName(MultipartFile file){ String extName=""; if (file.getOriginalFilename().lastIndexOf(".") >= 0){ extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); } return extName; } }
html前台頁面代碼
上傳按鈕
<a class="btn red btn-circle btn-sm" href="javascript:importData('file/upload');"> 上傳文件 <i class="fa fa-upload"></i> </a> <script> function importData(url) { dialog = bootbox.confirm({ title : '請選擇文件', message : '<form id="uploadFileForm" class="form-horizontal"><input type="file" name="file" value="選擇文件" id="uploadFileInput" class="btn sbold green"/></form>', buttons: { confirm: { label: '上傳', className: 'btn-success' }, cancel: { label: '取消', className: 'btn-danger' } }, callback: function (result) { if(result){ var formData = new FormData($( "#uploadFileForm" )[0]); $.ajax({ type: "POST", url: url, data: formData, dataType:'json', async: false, cache: false, contentType: false, //必須false才會自動加上正確的Content-Type processData: false, //必須false才會避開jQuery對 formdata 的默認處理 error: function(request) { bootbox.alert("網絡異常"); }, success: function(data){ if (data.response == 'true') { bootbox.alert("上傳成功!"); $table.bootstrapTable('refresh'); dialog.modal('hide'); } else { bootbox.alert(data.message); } } }); } } }); } </script>
下載按鈕
<a class="btn default" id="demo_1" href="file/download?file_id=1" target="_blank"> 下載文件 <i class="fa fa-download"></i> </a>
刪除按鈕
<a class="btn red" id="demo_1" href="file/delete?file_id=1"> 刪除文件 <i class="fa fa-remove"></i> </a>