1、前臺
前臺可以使用$("#form").ajaxSubmit(function(result) {})方法提交表單,如下方式可以在當前頁面不刷新不跳轉的的狀態下完成表單的提交。
//保存內容
function submitForm() {
if(confirm("是否確認辦理延期申請?")) {
if(save()){
var url=webCfg.servePath + "/dcdbDelay/saveUpload";
$("#form").attr("enctype","multipart/form-data");
$("#form").attr("action",url);
//$("#form").attr("target","nm_iframe");
//$("#form").submit();
//alert("保存成功");
// jquery 表單提交
$("#form").ajaxSubmit(function(result) {
var data = $.parseJSON(result);
// 對於表單提交成功後處理,message爲表單正常提交後返回的內容
if (data.status === true) {
alert("保存成功!");
$('#basis').css("color","black");
$('#delayDate').css("color","black");
}else{
alert(data.msg);
}
});
}
}
return false; // 必須返回false,否則表單會自己再做一次提交操作,並且頁面跳轉
}
2、後臺
後臺以SpringMVC處理文件的上傳保存和下載。此處示例文件上傳後保存在本地,實際項目中需要把文件保存到文件服務器上。
2.1 文件上傳保存
/**
* 保存上傳文件信息
* @param model
* @param request
* @param file
* @return
* @throws IOException
* @throws ParseException
*/
@RequestMapping(value = "/saveUpload", method = RequestMethod.POST)
@ResponseBody
public Object saveUpload(@RequestParam("file") MultipartFile file, HttpServletRequest request,
HttpServletResponse response) throws IOException, ParseException {
response.setContentType("text/html;charset=utf-8");
//獲取前臺參數
String taskSubId = request.getParameter("taskSubId");
String delayId = request.getParameter("delayId");
JSONObject result = new JSONObject();
String fileName = file.getOriginalFilename();
fileId = UUID.randomUUID().toString();
if (fileName != null && !"".equals(fileName)) {
InputStream iso = file.getInputStream();
SaveFileFromInputStream(iso, "", fileName);
}
//保存信息至數據庫(delayAO是實體類)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
DcdbTaskDelayAO delayAO = new DcdbTaskDelayAO();
delayAO.setId(delayId);
delayAO.setDcdbSubTaskId(taskSubId);
delayAO.setFileName(fileName );
delayAO.setFilePath("D:\\" + fileName);
delayAO.setFileId(fileId);
ServiceResult<Boolean> saveResult = dcdbTaskDelayService.saveOrUpdate(delayAO);
if (saveResult != null && saveResult.getData() == true) {
result.put("status", true);
result.put("msg", "保存成功");
} else {
result.put("status", false);
result.put("msg", "保存失敗!");
}
return retString(result);
}
//保存上傳的附件至服務器
public void SaveFileFromInputStream(InputStream is, String path, String filename) throws IOException {
FileOutputStream fs = new FileOutputStream(path + "D:\\" + filename);
byte[] buffer = new byte[1024 * 1024];
int bytesum = 0;
int byteread = 0;
while ((byteread = is.read(buffer)) != -1) {
bytesum += byteread;
fs.write(buffer, 0, byteread);
fs.flush();
}
fs.close();
is.close();
}
//JASON對象格式化
private Object retString(JSONObject result) {
String jsoStr = "";
try {
jsoStr = JSON.json(result);
} catch (IOException e) {
e.printStackTrace();
return jsoStr;
}
return jsoStr;
}
2.2文件的下載
文件的下載需要在前臺提供一個可供使用的文件id,用於去數據庫查詢文件信息後下載。
/**
* 下載文件
* @param request
* @param filename
* @param filePath
* @param model
* @return
* @throws Exception
*/
@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadFile(HttpServletRequest request, @RequestParam("delayId") String delayId,
Model model) throws Exception {
ServiceResult<DcdbTaskDelayAO> saveResult = dcdbTaskDelayService.getById(delayId);
String filePath = saveResult.getData().getFilePath();
int startIndex = filePath.lastIndexOf("\\");
String filename = filePath.substring(startIndex + 1);
//下載文件路徑
File file = new File(filePath + File.separator);
HttpHeaders headers = new HttpHeaders();
//下載顯示的文件名,解決中文名稱亂碼問題
String downloadFielName = setFileName(request, filename);
//通知瀏覽器以attachment(下載方式)打開圖片
headers.setContentDispositionFormData("attachment", downloadFielName);
//application/octet-stream : 二進制流數據(最常見的文件下載)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}
/**
* 處理下載文件名編碼問題;
* @param request
* @param response
* @param name
* @throws UnsupportedEncodingException
*/
public String setFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident")) {// IE
fileName = java.net.URLEncoder.encode(fileName, "UTF8");
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
return fileName;
}