# 0503 ## 第一節課 ### 輸出輸入 檔案: eclipse viewfile.java HelloWorld.java web.xml 輸出時文字只能用Writer() 圖片文字都可以用getOutputStream() 開啟檔案依照副檔名判斷,電腦會判斷應該用何者開啟 檔案傳輸時,僅會傳送內容的100110101的機器碼,需要用Content-Type,Content-Length等註解,否則可能檔案開不起來(EX:XXX.txt存成XXX.gif),PS:Content-Type內容為MIME type,詳見P.111 setContentType用途:設定IO的檔案格式 ViewFile.java會動態生成MIME type ``` String contentType = getServletContext().getMimeType(file); res.setContentType(contentType); ``` 存取檔案預設在eclipse中會在WebContent底下(images/tomcat),tomcat則在專案底下 *為前置路徑對應 IO的三讀三寫 read三個覆寫read(),read(byte[]),read(byte[],int,int) write三個覆寫同上 InputStream中的available()可得知檔案大小 IO中進入時可能亂碼,但輸出時會整包一起出去,不會變亂碼(IO基本觀念) collection、map大小為size(),InputStream大小為available(),陣列為length其餘為length() ## 第二節課 ### 延續上面 P.112中的內容為規格書規定,不要問為什麼! #### setheader(下載) 透過IO中的特性,new出一個物件後,可透過getName()可取得該檔案的檔名 chrome瀏覽器可以不用設setHeader,也可以下載檔案且不會產生副檔名錯誤的問題 edge、IE則會直接開啟檔案,並不會進行下載(需要使用serHeader才能下載) ``` res.setContentType("application/force-download"); res.setHeader("Content-Disposition", "attachment; filename=\""+(new File(file)).getName()+"\" "); ``` #### 阿飄路徑 在上傳/下載時,IDE與伺服端因為位置不同,伺服端的操作不會顯示在IDE上,IDE上的動作則一定會對應丟到伺服端中,因此有時路徑上IDE沒顯示某個圖片,卻能抓的到該圖片的話,可能是因為在伺服端中有存在檔案 上傳的檔案可能會在伺服端,IDE可能看不見 伺服端 C:\TFA101_WebApp\eclipse_WTP_workspace1\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SL314\images IDE端 C:\TFA101_WebApp\eclipse_WTP_workspace1\SL314\WebContent\images ## 第三節課 ### 承上啟下 獨立貓當中,MIME型態對應存在於web.xml,路徑在/conf中 路徑關係講解 課本109的方法5,6,7(可把1.txt改成1111111.txt 阿飄路徑) ![](https://i.imgur.com/v3RB4J9.jpg) get,預設post,上傳的post所產生的html頁面結果 ## 第四節課 UplatTest_Servlet3.java Upload.html 從WebApp_ch04.....開啟 ### Request Header param與header類似,都有getXXXname,但取值方法:headers(String name)取值,paramvalues(String name);取值方法兩者不同 P.236隱含物件認識,剩cookie還不熟 ### 檔案上傳 專案匯入後,需啟動才會導入阿飄路徑 MultipartConfig P.118 限制檔案上傳大小等相關設定 ``` @MultipartConfig(fileSizeThreshold = 1024 * 1024, maxFileSize = 5 * 1024 * 1024, maxRequestSize = 5 * 5 * 1024 * 1024) ``` ## 第五節課 ### Part Part是從Servlet3.0之後才有 前置動作>將PNG副檔名改為GIF後 進行getContentType(); Chrome:檔名重複會進行覆蓋(包含副檔名也要重複),PNG會被認定為GIF,以副檔名為主 IE:不會因為PNG改成GIF而認定是GIF,不會進行覆蓋 上傳時用資料庫,儲存成BLOB,方便之後圖片或商品資訊管理會比較好(用PK管控) 送入資料庫用PreparedStatement 以下三種方法: setBlob,setBinaryStream 參數會有InputStream,但不建議,因需要關檔 setBytes 因此建議setBytes(直接存成byte[],最建議使用) getContentType()不好用,Chrome會錯誤 補充statement ![](https://i.imgur.com/NB0UVib.jpg) API無提供取得方法 需自己撰寫getFileNameFromPart(); Servlet3.1之後新增 getHeader("content-disposition"),//測試用 以下程式用於取得檔案名稱,Chrome可不用new File,但IE,firefox需要,因此下面有new file(XXXXX).getname()的存在 ``` public String getFileNameFromPart(Part part) { String header = part.getHeader("content-disposition"); System.out.println("header=" + header); // 測試用 String filename = new File(header.substring(header.lastIndexOf("=") + 2, header.length() - 1)).getName(); System.out.println("filename=" + filename); // 測試用 if (filename.length() == 0) { return null; } return filename; } ``` String filename = part.getSubmittedFileName()取得檔案名稱,僅有Chrome類似的能用 ## 第六節課 ### 上傳三要素 1.`method=post enctype="multipart/form-data" ` method要post,才能傳遞enctype跟第二要素ype為multipart/form-data 2.`@MultipartConfig(fileSizeThreshold = 1024 * 1024, maxFileSize = 5 * 1024 * 1024, maxRequestSize = 5 * 5 * 1024 * 1024)` @MultipartConfig需註冊,Config之後可省略也能執行 3.要有dopost做對應接前面傳來的資料,且做4的程式碼取值PART 4.我亂打的`Collection<Part> parts = req.getParts();` Part.getPart 檔案第15行:`String saveDirectory = "/images_uploaded"; ` 可在web.xml中註冊,變全動態,但怕偏離主題,因此老師放在JAVA檔裡 觀念補充,以前圖文需要分開傳,part出現後則不用 寫專題時,用byte[]來宣告圖片,BLOB儲存於資料庫當中 ###### tags: `大吳上課` `Servlet`