檔案上傳(FileUpload)
檔案上傳
目錄Jsp:
1.input的type屬性設定為file(在layui、bootstrap等地方也可以找到更好看的控制元件)
2.form表單的method設定為post。(get請求會將檔名傳給伺服器,而不是檔案本身,也就是傳過去一個字串)
3.form表單的enctype屬性設定為 multipart/form-data(這種情況下將以二進位制的形式傳輸資料)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>upload</title> </head> <body> <form method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" name="提交"> </form> </body> </html>
Servlet:
測試文字:
Java Web,是用Java技術來解決相關web網際網路領域的技術棧。
web包括:web服務端和web客戶端兩部分。
Java在客戶端的應用有Java Applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP、第三方框架等等。
Java技術對Web領域的發展注入了強大的動力。
Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
Java語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。
下面是檔案上傳程式碼:
package com.wildfire.servlet.upload; import com.wildfire.servlet.HttpServlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; @WebServlet("/upload") public class upload extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //通過輸入流獲取從客戶端傳來的資料。 //使讀取速度加快 //位元組流 InputStream inputStream=req.getInputStream(); //字元流 Reader reader=new InputStreamReader(inputStream); //緩衝流 BufferedReader bufferedReader=new BufferedReader(reader); //通過輸出流將資料輸出到本地應用 //獲取資料夾的絕對路徑,file是資料夾的名稱,ceshifuben.txt要輸出到的txt檔案 //要注意這裡的file的建立位置,不能直接在IDEA裡面建立,需要找到自己的工程目錄,在其中的out資料夾下找到artifacts再在相應專案下建立file String path=req.getServletContext().getRealPath("/file/ceshifuben.txt"); //輸出流 OutputStream outputStream=new FileOutputStream(path); //輸出位元組流 Writer writer=new OutputStreamWriter(outputStream); //輸出緩衝流 BufferedWriter bufferedWriter=new BufferedWriter(writer); //寫入 String str=""; //注意這裡是兩個括號 while((str=bufferedReader.readLine())!=null){ bufferedWriter.write(str); } //關閉輸入輸出流 bufferedReader.close(); bufferedWriter.close(); writer.close(); reader.close(); inputStream.close(); outputStream.close(); } }
要注意這裡的file的建立位置,不能直接在IDEA裡面建立,需要找到自己的工程目錄,在其中的out資料夾下找到artifacts再在相應專案下建立file
例如我的建立位置:D:\WorkPlace\IntellijIDEAWorkPlace\IntellijIDEAJavaWebWorkPlace\javaweb學習1\out\artifacts\javaweb1_war_exploded2\file
得到的文字如下:
-----------------------------39165874219639205374108370503Content-Disposition: form-data; name="file"; filename="ceshi.txt"Content-Type: text/plainJava Web,是用Java技術來解決相關web網際網路領域的技術棧。web包括:web服務端和web客戶端兩部分。Java在客戶端的應用有Java Applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP、第三方框架等等。Java技術對Web領域的發展注入了強大的動力。Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。-----------------------------39165874219639205374108370503--
沒有完成段落的劃分,而且前後各多了一串字元,這是瀏覽器的附加資訊。雖然能完成檔案上傳,但是效果並不是很好,所以我們大多采用以下方法:
使用FileUpload元件。
第一步:匯入jar包:commons-fileupload-1.4.jar、commons-io-2.8.0.jar(使用IDEA時要注意這兩個包需要同時匯入)。
第二步:使用fileupload
fileupload元件可以將所有請求資訊都解析成一個fileupload物件,我們可以通過對fileupload物件的操作完成上傳,體現了面向物件的思想。
雖然使用位元組流緩衝流讀取輸出速度更快,但是如果輸出的文字需要換行或者是圖片,就必須使用位元組流,位元組流能讀取換行符,而且可以傳輸圖片。
程式碼如下:
package com.wildfire.servlet.upload;
import com.wildfire.servlet.HttpServlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet("/upload")
public class upload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
DiskFileItemFactory fileItemFactory=new DiskFileItemFactory();
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
List<FileItem> list=servletFileUpload.parseRequest(req);
for(FileItem fileItem:list){
//判斷是否是檔案
if(fileItem.isFormField()){
//不是檔案,是文字框等其他控制元件
String name=fileItem.getName();
//設定字符集為UTF-8
String value=fileItem.getString("UTF-8");
//在控制檯輸出文字框的name和value值
System.out.println(name+":"+value);
}else{
//是檔案
String filename=fileItem.getName();
long size=fileItem.getSize();
System.out.print(filename+":"+size+":"+"Byte");
//讀入
InputStream inputStream=fileItem.getInputStream();
/*Reader reader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(reader);*/
//尋找路徑,建立檔案
String path=req.getServletContext().getRealPath("file/"+filename);
OutputStream outputStream=new FileOutputStream(path);
/*Writer writer=new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter=new BufferedWriter(writer);*/
int temp=0;
while((temp=inputStream.read())!=-1){
outputStream.write(temp);
}
/*bufferedReader.close();
writer.close();*/
outputStream.close();
/* bufferedWriter.close();
reader.close();*/
inputStream.close();
System.out.println("上傳成功!");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
這是使用fileupload之後得到的檔案:
Java Web,是用Java技術來解決相關web網際網路領域的技術棧。
web包括:web服務端和web客戶端兩部分。
Java在客戶端的應用有Java Applet,不過使用得很少,Java在伺服器端的應用非常的豐富,比如Servlet,JSP、第三方框架等等。
Java技術對Web領域的發展注入了強大的動力。
Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。
Java語言作為靜態面向物件程式語言的代表,極好地實現了面向物件理論,允許程式設計師以優雅的思維方式進行復雜的程式設計。
可以很明顯的看出和原始檔一致。