文件上传介绍
文件上傳
問題:什么是文件上傳?為什么使用文件上傳?
就是將客戶端資源,通過網絡傳遞到服務器端。????????
就是因為數據比較大,我們必須通過文件上傳才可以完成將數據保存到服務器端操作.
????????????
文件上傳的本質:就是IO流的操作。
????????????
演示:文件 上傳應該 怎樣操作?
????
瀏覽器端:
?
1.method=post 只有post才可以攜帶大數據
2.必須使用<input type='file' name='f'>要有name屬性
3.encType="multipart/form-data"
????????
服務器端:
request對象是用于獲取請求信息。
它有一個方法getInputStream(); 可以獲取一個字節輸入流,通過這個流,可以讀取到
所有的請求正文信息.
????????????
文件上傳原理:
瀏覽器端注意上述三件事,在服務器端通過流將數據讀取到,在對數據進行解析.
將上傳文件內容得到,保存在服務器端,就完成了文件上傳。
????????????
在實際開發中,不需要我們進行數據解析,完成文件上傳。因為我們會使用文件上傳的工具,它們已經封裝好的,
提供API,只要調用它們的API就可以完成文件上傳操作.
????
我們使用的commons-fileupload,它是apache提供的一套開源免費的文件上傳工具。
?
?
package cn.learn.web.servlet;import java.io.IOException; import java.io.InputStream;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class Upload1Servlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//通過request獲取一個字節輸入流,將所有的請求正文信息讀取到,打印到控制臺。InputStream is=request.getInputStream();byte[] b=new byte[1024];int len=-1;while((len=is.read(b))!=-1){System.out.print(new String(b,0,len));}is.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}實現web開發中的文件上傳功能,需完成如下二步操作:??
?? ?在web頁面中添加上傳輸入項
?? ?在servlet中讀取上傳文件的數據,并保存到服務器硬盤中。
如何在web頁面中添加上傳輸入項?
?? ?<input type=“file”>標簽用于在web頁面中添加文件上傳輸入項,設置文件上傳輸入項時須注意:
?? ?1、必須要設置input輸入項的name屬性,否則瀏覽器將不會發送上傳文件的數據。
?? ?2、必須把form的enctype屬值設為multipart/form-data.設置該值后,瀏覽器在上傳文件時,將把文件數據附帶在http請求消息體中,
?? ??? ?并使用MIME協議對上傳的文件進行描述,以方便接收方對上傳數據進行解析和處理。
?? ?3、表單的提交方式要是post
如何在Servlet中讀取文件上傳數據,并保存到本地硬盤中?
?? ?Request對象提供了一個getInputStream方法,通過這個方法可以讀取到客戶端提交過來的數據。
?? ??? ?但由于用戶可能會同時上傳多個文件,在servlet端編程直接讀取上傳數據,并分別解析出相應的文件數據
?? ??? ?是一項非常麻煩的工作,示例。
?? ?為方便用戶處理文件上傳數據,Apache 開源組織提供了一個用來處理表單文件上傳的一個開源組件( Commons-fileupload ),
?? ??? ?該組件性能優異,并且其API使用極其簡單,可以讓開發人員輕松實現web文件上傳功能,因此在web開發中實現文件上傳功能,
?? ??? ?通常使用Commons-fileupload組件實現。
?
?
總結