spring boot 引入”約定大于配置“的概念,實現自動配置,節約了開發人員的開發成本,并且憑借其微服務架構的方式和較少的配置,一出來就占據大片開發人員的芳心。大部分的配置從開發人員可見變成了相對透明了,要想進一步熟悉還需要關注源碼。
1.文件上傳(前端頁面):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" > < title >Insert title here</ title > </ head > < body > < form action = "/testUpload" method = "POST" enctype = "multipart/form-data" > < input type = "file" name = "file" /> < input type = "submit" /> </ form > < a href = "/testDownload" rel = "external nofollow" >下載</ a > </ body > </ html > |
表單提交加上enctype="multipart/form-data"很重要,文件以二進制流的形式傳輸。
2.文件上傳(后端java代碼)支持多文件
Way1.使用MultipartHttpServletRequest來處理上傳請求,然后將接收到的文件以流的形式寫入到服務器文件中:
1
2
3
4
5
6
7
8
9
10
11
12
|
@RequestMapping (value= "/testUpload" ,method=RequestMethod.POST) public void testUploadFile(HttpServletRequest req,MultipartHttpServletRequest multiReq) throws IOException{ FileOutputStream fos= new FileOutputStream( new File( "F://test//src//file//upload.jpg" )); FileInputStream fs=(FileInputStream) multiReq.getFile( "file" ).getInputStream(); byte [] buffer= new byte [ 1024 ]; int len= 0 ; while ((len=fs.read(buffer))!=- 1 ){ fos.write(buffer, 0 , len); } fos.close(); fs.close(); } |
Way2.也可以這樣來取得上傳的file流:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// 文件上傳 @RequestMapping ( "/fileUpload" ) public Map fileUpload( @RequestParam ( "file" ) MultipartFile file, HttpServletRequest req) { Map result = new HashMap(); SimpleDateFormat df = new SimpleDateFormat( "yyyyMMdd" ); // 設置日期格式 String dateDir = df.format( new Date()); // new Date()為獲取當前系統時間 String serviceName = UuidUtil.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf( "." )); File tempFile = new File(fileDir + dateDir + File.separator + serviceName); if (!tempFile.getParentFile().exists()) { tempFile.getParentFile().mkdirs(); } if (!file.isEmpty()) { try { BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(tempFile)); // "d:/"+file.getOriginalFilename() 指定目錄 out.write(file.getBytes()); out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); result.put( "msg" , "上傳失敗," + e.getMessage()); result.put( "state" , false ); return result; } catch (IOException e) { e.printStackTrace(); result.put( "msg" , "上傳失敗," + e.getMessage()); result.put( "state" , false ); return result; } result.put( "msg" , "上傳成功" ); String fileId = Get8uuid.generateShortUuid(); String fileName = file.getOriginalFilename(); String fileType = fileName.substring(fileName.lastIndexOf( "." ) + 1 ); String fileUrl = webDir + dateDir + '/' + serviceName; uploadMapper.saveFileInfo(fileId, serviceName, fileType, fileUrl); result.put( "state" , true ); return result; } else { result.put( "msg" , "上傳失敗,因為文件是空的" ); result.put( "state" , false ); return result; } |
3.application.properties配置文件
1
2
3
|
#上傳文件大小設置 multipart.maxFileSize=500Mb multipart.maxRequestSize=500Mb |
4.文件下載將文件寫到輸出流里:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@RequestMapping (value= "/testDownload" ,method=RequestMethod.GET) public void testDownload(HttpServletResponse res) throws IOException{ File file = new File( "C:/test.txt" ); resp.setHeader( "content-type" , "application/octet-stream" ); resp.setContentType( "application/octet-stream" ); resp.setHeader( "Content-Disposition" , "attachment;filename=" + fileName); byte [] buff = new byte [ 1024 ]; BufferedInputStream bis = null ; OutputStream os = null ; try { os = resp.getOutputStream(); bis = new BufferedInputStream( new FileInputStream(file)); int i = bis.read(buff); while (i != - 1 ) { os.write(buff, 0 , buff.length); os.flush(); i = bis.read(buff); } } catch (IOException e) { e.printStackTrace(); } finally { if (bis != null ) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
5.獲取文件大小
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 文件大小轉換 DecimalFormat df1 = new DecimalFormat( "0.00" ); String fileSizeString = "" ; long fileSize = file.getSize(); if (fileSize < 1024 ) { fileSizeString = df1.format(( double ) fileSize) + "B" ; } else if (fileSize < 1048576 ) { fileSizeString = df1.format(( double ) fileSize / 1024 ) + "K" ; } else if (fileSize < 1073741824 ) { fileSizeString = df1.format(( double ) fileSize / 1048576 ) + "M" ; } else { fileSizeString = df1.format(( double ) fileSize / 1073741824 ) + "G" ; } |
如果是File類則fileSize=file.length()。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。