1.後臺部分
import com.alibaba.fastjson.JSONObject;
import com.sekorm.flow.webentity.ResponseBean;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
@Component
public class FileUtils {
private static Logger log = Logger.getLogger(FileUtils.class);
private static String uploadPath;
@Value("${upload_path}")
public void setUploadPath(String uploadPath) {
FileUtils.uploadPath = uploadPath;
}
public String getUploadPath() {
return uploadPath;
}
public static JSONObject upload(HttpServletRequest request , HttpServletResponse response){
JSONObject responseBean = new JSONObject();
responseBean.put("code", -1);
try {
//建立一個通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判斷 request 是否有文件上傳,即多部分請求(即檢查form中是否有enctype="multipart/form-data")
if(multipartResolver.isMultipart(request)){
//轉換成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//取得request中的全部input的name
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//取得一個input裏面全部的上傳文件
List<MultipartFile> list = multiRequest.getFiles(iter.next());
for(MultipartFile file : list){
if(file != null){
//取得當前上傳文件的文件名稱
String myFileName = file.getOriginalFilename();
//若是名稱不爲「」,說明該文件存在,不然說明該文件不存在
if(!StringUtils.isBlank(myFileName) && myFileName.trim() != null){
//重命名上傳後的文件名
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMddHHmmss");
String saveName = myFileName.substring(0,myFileName.lastIndexOf("."))+"_"+sdf.format(date).toString() + myFileName.substring(myFileName.lastIndexOf("."));
//定義上傳路徑
File localFile = new File(uploadPath,saveName);
File pathIsExit = new File(uploadPath);
if(!pathIsExit.exists() && !pathIsExit .isDirectory()){
pathIsExit.mkdirs();
}
if(!localFile.exists()){
localFile.createNewFile();
}
//保存
file.transferTo(localFile);
responseBean.put("data",saveName);
}
}
}
}
}
responseBean.put("code",0);
}catch (Exception e){
log.error("上傳文件報錯->%",e);
responseBean.put("msg","上傳文件報錯");
}
return responseBean;
}
public static void load(HttpServletRequest request , HttpServletResponse response){
try{
//獲取網站部署路徑(經過ServletContext對象),用於肯定下載文件位置,從而實現下載
String path =uploadPath;
String fileName=URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
//1.設置文件ContentType類型,這樣設置,會自動判斷下載文件類型
response.setContentType("multipart/form-data");
//2.設置文件頭:最後一個參數是設置下載文件名(假如咱們叫a.pdf)
response.setHeader("Content-Disposition", "attachment;fileName="+java.net.URLEncoder.encode(fileName, "UTF-8"));
ServletOutputStream out;
//經過文件路徑得到File對象(假如此路徑中有一個download.pdf文件)
File file = new File(path + fileName);
out = response.getOutputStream();
FileInputStream inputStream = new FileInputStream(file);
try {
//3.經過response獲取ServletOutputStream對象(out)
int b = 0;
byte[] buffer = new byte[1204];
while ((b =inputStream.read(buffer))!= -1){
//4.寫到輸出流(out)中
out.write(buffer,0,b);
out.flush();
}
} catch (IOException e) {
log.error("下載文件報錯->%",e);
}finally {
out.close();
inputStream.close();
}
}catch (Exception e){
log.error("下載文件報錯->%",e);
}
}
}
2.js 部分
//上傳文件事件
$("#myFile").bind("change",function () {
$("#dwform").attr("enctype","multipart/form-data");
$.ajax({
url: $("#PageContext").val()+'/file/upload' ,
type: 'POST',
cache: false,
data: new FormData($('#dwform')[0]),
processData: false,
contentType: false,
dataType:"json",
success : function(data) {
console.log(data.code);
if(data.code==0){
$("#fileName").val(data.data);
$("#loadFile").remove();
}else{
layer.msg(data.msg);
}
}
});
})
});
//下載文件
function load(fileName) {
var $ = layui.jquery;
var url= $("#PageContext").val()+'/file/load?fileName='+encodeURI(encodeURI(fileName)) ;
window.open(url);
}
3.頁面部分
<a onclick="javascript:load('迷你截圖_20190110140346.exe')">迷你截圖_20190110140346.exe</a>
4. controller 部分
@Controller@RequestMapping(value = "/file")public class FileController { private static Logger log = Logger.getLogger(FileController.class); @RequestMapping(value = "/upload") @ResponseBody public JSONObject upload(@ModelAttribute DW dw, HttpServletRequest request, HttpServletResponse resp) { JSONObject responseBean = new JSONObject(); responseBean.put("code", -1); try { return FileUtils.upload(request,resp); }catch (Exception e) { log.error("上傳文件失敗{}->",e); responseBean.put("msg","上傳文件失敗"); } return responseBean; } @RequestMapping(value = "/load") @ResponseBody public void load(@ModelAttribute DW dw, HttpServletRequest request, HttpServletResponse resp) { try { FileUtils.load(request,resp); }catch (Exception e) { log.error("下載文件失敗{}->",e); } }}