Muat naik fail Servlet
Servlet boleh digunakan dengan teg borang HTML untuk membolehkan pengguna memuat naik fail ke pelayan. Fail yang dimuat naik boleh menjadi fail teks atau fail imej atau sebarang dokumen.
Buat borang muat naik fail
Kod HTML berikut mencipta borang muat naik fail. Perkara berikut perlu diberi perhatian: Atribut
kaedah hendaklah ditetapkan kepada kaedah POST dan kaedah GET tidak boleh digunakan.
formenctype atribut hendaklah ditetapkan kepada multipart/form-data.
borang < Atribut 🎜>action hendaklah ditetapkan kepada fail Servlet yang mengendalikan muat naik fail pada pelayan bahagian belakang. Contoh di bawah menggunakan Servlet UploadServlet untuk memuat naik fail.
- Untuk memuat naik satu fail, anda harus menggunakan teg <input .../> dengan atribut type="file". Untuk membenarkan berbilang muat naik fail, sertakan berbilang teg input dengan nilai atribut nama yang berbeza. Teg input mempunyai nilai yang berbeza untuk atribut nama. Penyemak imbas mengaitkan butang semak imbas dengan setiap teg input.
<html> <head> <title>文件上传表单</title> </head> <body> <h3>文件上传:</h3> 请选择要上传的文件:<br /> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="上传文件" /> </form> </body> </html>Ini akan memaparkan hasil berikut, membolehkan pengguna memilih fail daripada komputer setempat mereka Apabila pengguna mengklik "Muat Naik Fail", borang akan diserahkan bersama-sama dengan fail dipilih daripada komputer tempatan mereka:
<b>文件上传:</b> 请选择要上传的文件:<br /> <input type="file" name="file" size="50" /> <br /> <input type="button" value="上传文件" /> <br /> 注:这只是虚拟的表单,不会正常工作。Tulis Servlet latar belakangBerikut ialah Servlet
UploadServlet, yang akan menerima fail yang dimuat naik dan menyimpannya dalam direktori < Tomcat-installation-directory>/webapps/ dalam data. Nama direktori ini juga boleh ditambah menggunakan konfigurasi luaran, seperti elemen context-param dalam web.xml, seperti yang ditunjukkan di bawah:
<web-app> .... <context-param> <description>Location to store uploaded file</description> <param-name>file-upload</param-name> <param-value> c:\apache-tomcat-5.5.29\webapps\data\ </param-value> </context-param> .... </web-app>Berikut ialah kod sumber UploadServlet, yang boleh memproses berbilang Muat naik fail. Sebelum meneruskan, sila sahkan perkara berikut:
- Contoh di bawah bergantung pada FileUpload, jadi pastikan anda mempunyai versi terkini
commons-fileupload pada classpath anda fail. Boleh dimuat turun dari http://commons.apache.org/fileupload/.
- FileUpload bergantung pada Commons IO, jadi pastikan anda mempunyai versi terkini fail
commons-io-x.x.jar dalam laluan kelas anda. Boleh dimuat turun dari http://commons.apache.org/io/.
- Apabila menguji contoh berikut, saiz fail yang anda muat naik tidak boleh lebih besar daripada
maxFileSize, jika tidak, fail tidak akan dimuat naik.
- Sila pastikan direktori c:temp dan c:apache-tomcat-5.5.29webappsdata telah dibuat terlebih dahulu.
// 导入必需的 java 库 import java.io.*; import java.util.*; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 org.apache.commons.io.output.*; public class UploadServlet extends HttpServlet { private boolean isMultipart; private String filePath; private int maxFileSize = 50 * 1024; private int maxMemSize = 4 * 1024; private File file ; public void init( ){ // 获取文件将被存储的位置 filePath = getServletContext().getInitParameter("file-upload"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 检查我们有一个文件上传请求 isMultipart = ServletFileUpload.isMultipartContent(request); response.setContentType("text/html"); java.io.PrintWriter out = response.getWriter( ); if( !isMultipart ){ out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); return; } DiskFileItemFactory factory = new DiskFileItemFactory(); // 文件大小的最大值将被存储在内存中 factory.setSizeThreshold(maxMemSize); // Location to save data that is larger than maxMemSize. factory.setRepository(new File("c:\temp")); // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(factory); // 允许上传的文件大小的最大值 upload.setSizeMax( maxFileSize ); try{ // 解析请求,获取文件项 List fileItems = upload.parseRequest(request); // 处理上传的文件项 Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { // 获取上传文件的参数 String fieldName = fi.getFieldName(); String fileName = fi.getName(); String contentType = fi.getContentType(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); // 写入文件 if( fileName.lastIndexOf("\") >= 0 ){ file = new File( filePath + fileName.substring( fileName.lastIndexOf("\"))) ; }else{ file = new File( filePath + fileName.substring(fileName.lastIndexOf("\")+1)) ; } fi.write( file ) ; out.println("Uploaded Filename: " + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { throw new ServletException("GET method used with " + getClass( ).getName( )+": POST method required."); } }Kompilasi dan jalankan Servlet Kompilasi Servlet UploadServlet di atas dan buat entri yang diperlukan dalam fail web.xml seperti berikut:
<servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping>Sekarang cuba muat naik fail menggunakan borang HTML yang anda buat di atas. Apabila anda melawati: http://localhost:8080/UploadFile.htm dalam penyemak imbas anda, ia akan memaparkan hasil berikut, yang akan membantu anda memuat naik sebarang fail dari komputer setempat anda.
<b>文件上传:</b> 请选择要上传的文件:<br /> <input type="file" name="file" size="50" /> <br /> <input type="button" value="上传文件" />Jika skrip Servelt anda berfungsi dengan betul, fail anda akan dimuat naik ke direktori c:apache-tomcat-5.5.29webappsdata.