# 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 阿飄路徑)

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

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`