上傳
這裏有一個實體 用於存放文件信息 存放路徑commonfile在配置文件中配置
@RestController
public class FileUpload {
@Value("${commonfile}")
private String commonfile;
/**
* 使用Spring MVC的multipartFile 類作爲參數
*
* @param multipartFile
* @return
*/
@PostMapping("/upload")
@ResponseBody
@ArchivesLog(operationName = "上傳")
public Result<FileMessage> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile) {
Result<FileMessage> result = new Result<FileMessage>();
FileMessage fileMessageVO = new FileMessage();
String fileName = multipartFile.getOriginalFilename();
try {
// 獲取文件字節數組
byte[] bytes = multipartFile.getBytes();
// 文件存儲路徑(/fileupload1/ 這樣會在根目錄下創建問價夾)
File pfile = new File(commonfile);
// 判斷文件夾是否存在
if (!pfile.exists()) {
// 不存在時,創建文件夾
pfile.mkdirs();
}
// 創建文件
File file = new File(pfile, fileName);
// 寫入指定文件夾
OutputStream out = new FileOutputStream(file);
out.write(bytes);
// 組裝對象
fileMessageVO.setFileName(fileName);
fileMessageVO.setFileRoute(commonfile);
fileMessageVO.setFileDownloadUri(commonfile + fileName);
fileMessageVO.setSize(getPrintSize(file.length()));
fileMessageVO.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
result.setData(fileMessageVO);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String getPrintSize(long size) {
// 如果字節數少於1024,則直接以B爲單位,否則先除於1024,後3位因太少無意義
if (size < 1024) {
return String.valueOf(size) + "B";
} else {
size = size / 1024;
}
// 如果原字節數除於1024之後,少於1024,則可以直接以KB作爲單位
// 因爲還沒有到達要使用另一個單位的時候
// 接下去以此類推
if (size < 1024) {
return String.valueOf(size) + "KB";
} else {
size = size / 1024;
}
if (size < 1024) {
// 因爲如果以MB爲單位的話,要保留最後1位小數,
// 因此,把此數乘以100之後再取餘
size = size * 100;
return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
} else {
// 否則如果要以GB爲單位的,先除於1024再作同樣的處理
size = size * 100 / 1024;
return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
}
}
}
實體類
public class FileMessage {
/**
* 文件名稱
*/
private String fileName;
/**
* 文件路徑
*/
private String fileRoute;
/**
* 下載地址
*/
private String fileDownloadUri;
/**
* 文件類型
*/
private String fileType;
/**
* 文件大小
*/
private String size;
}
下載
@RestController
public class FileDownload {
@Value("${commonfile}")
private String commonfile;
@GetMapping("/download")
public String downloadFile(FileMessage fileMessage) throws UnsupportedEncodingException {
// 獲取HttpServletResponse
HttpServletResponse response =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
String fileName = fileMessage.getFileName();// 文件名
if (fileName != null) {
// 設置文件路徑
File file = new File(commonfile + fileName);
if (file.exists()) {
RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
// 獲得瀏覽器代理信息
final String userAgent = request.getHeader("USER-AGENT");
// 判斷瀏覽器代理並分別設置響應給瀏覽器的編碼格式
if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
// IE瀏覽器
fileName = URLEncoder.encode(fileName, "UTF-8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {
// google,火狐瀏覽器
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
} else {
// 其他瀏覽器
fileName = URLEncoder.encode(fileName, "UTF-8");// 其他瀏覽器
}
// 設置HTTP響應頭
response.reset();
// 重置 如果不在頁面上顯示而是下載下來 則放開註釋
// response.setContentType("application/octet-stream");// 告知瀏覽器下載文件,而不是直接打開,瀏覽器默認爲打開
// response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");// 下載文件的名稱
try {
OutputStream os = response.getOutputStream();
// 讀取文件
InputStream in = new FileInputStream(file);
// copy文件
IOUtils.copy(in, os);
in.close();
os.close();
return "下載成功";
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "下載失敗";
}
}