文件測試客戶端需要通過http的post方式向服務器上傳文件,並且應用服務器需要保存這個文件。因此需要搭建一個局域網的服務器來接受,因為之前沒有任何這方面的經驗,走了不少彎路,因此記錄下來自己做記錄或者能給看到的人提供一點點幫助。
我使用的是VMware player虛擬機工具搭建的Ubuntu 16.04版本的系統,首先需要安裝Apache,在Ubuntu中可以使用sudo apt install apache2直接安裝,然后可以通過sudo apt install tomcat8來安裝。具體這些按照教程可以在網上很多例子,這里就不再贅述。//可以通過Tab鍵來看tomcat下有哪些版本。具體的Servlet知識可以參考 菜鳥教程。
當安裝成功后可以在瀏覽器中打開127.0.0.1:8080來打開tomcat的默認界面。能正常打開即表明安裝成功。
tomcat的主頁地址在/var/lib/tomcat8/webapps路徑,我們可以在目錄webapps下新建一個文件夾myapps來包含我們的Servlet程序。
其中文件組織結構應該為:
webapps
--myapps
--upload.html
--temp :臨時文件,注意文件的讀寫權限
--uploadFile:上傳文件的目錄,注意文件的讀寫權限
--WEB-INF
--web.xml
--lib //需要的庫文件,點擊下載
--commons-fileupload-1.3.2.jar
--classes
--UploadServlet.class //編譯生成的Servlet
本次需要的文件主要有:
WEB-INF 子目錄中包含應用程序的部署描述符,名為 web.xml
upload.html :文件上傳頁面,網頁測試用。
UploadServlet.java:上傳處理Servlet程序
upload.html文件如下:
<html> <head> <title>Servlet upload</title></head> <body > <form name="uploadForm" method="POST" enctype="MULTIPART/FORM-DATA" action="upload"> User Name:<input type="text" name="username" size="30"/> Upload File1:<input type="file" name="file1" size="30"/> Upload File2:<input type="file" name="file2" size="30"/> <input type="submit" name="submit" value="upload"> <input type="reset" name="reset" value="reset"> </form> </body> </html>
UploadServlet.java文件:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.*; // Servlet 文件上傳 public class UploadServlet extends HttpServlet { private String filePath; // 文件存放目錄 private String tempPath; // 臨時文件目錄 // 初始化 public void init(ServletConfig config) throws ServletException { super.init(config); // 從配置文件中獲得初始化參數 filePath = config.getInitParameter("filepath"); tempPath = config.getInitParameter("temppath"); ServletContext context = getServletContext(); filePath = context.getRealPath(filePath); tempPath = context.getRealPath(tempPath); System.out.println("文件存放目錄、臨時文件目錄准備完畢 ..."); } // doPost public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/plain;charset=gbk"); PrintWriter pw = res.getWriter(); try{ DiskFileItemFactory diskFactory = new DiskFileItemFactory(); // threshold 極限、臨界值,即硬盤緩存 1M diskFactory.setSizeThreshold(4 * 1024); // repository 貯藏室,即臨時文件目錄 diskFactory.setRepository(new File(tempPath)); ServletFileUpload upload = new ServletFileUpload(diskFactory); // 設置允許上傳的最大文件大小 4M upload.setSizeMax(4 * 1024 * 1024); // 解析HTTP請求消息頭 List fileItems = upload.parseRequest(req); Iterator iter = fileItems.iterator(); while(iter.hasNext()) { FileItem item = (FileItem)iter.next(); if(item.isFormField()) { System.out.println("處理表單內容 ..."); processFormField(item, pw); }else{ System.out.println("處理上傳的文件 ..."); processUploadFile(item, pw); } }// end while() pw.close(); }catch(Exception e){ System.out.println("使用 fileupload 包時發生異常 ..."); e.printStackTrace(); }// end try ... catch ... }// end doPost() // 處理表單內容 private void processFormField(FileItem item, PrintWriter pw) throws Exception { String name = item.getFieldName(); String value = item.getString(); pw.println(name + " : " + value + "\r\n"); } // 處理上傳的文件 private void processUploadFile(FileItem item, PrintWriter pw) throws Exception { // 此時的文件名包含了完整的路徑,得注意加工一下 String filename = item.getName(); System.out.println("完整的文件名:" + filename); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long fileSize = item.getSize(); if("".equals(filename) && fileSize == 0) { System.out.println("文件名為空 ..."); return; } File uploadFile = new File(filePath + "/" + filename); item.write(uploadFile); pw.println(filename + " 文件保存完畢 ..."); pw.println("文件大小為 :" + fileSize + "\r\n"); } // doGet public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doPost(req, res); } }
web.xml文件:
<?xml version="1.0" encoding="gb2312"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> <init-param> <param-name>filepath</param-name> <param-value>uploadFile</param-value> </init-param> <init-param> <param-name>temppath</param-name> <param-value>temp</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>
因為只是一個小程序,所以沒有建立工程使用IDE進行編譯項目,直接通過命令行,javac命令來編譯UploadServlet.java。編譯這個文件的時候需要知道其包含的jar文件。這個程序中用到了commons-fileupload-1.3.2.jar還有servlet-api.jar 所以編譯的時候需要指定javac -cp /usr/share/tomcat8/lib/servlet-api.jar:/var/lib/tomcat8/webapps/myapps/WEB-INF/lib/commons-fileupload-1.3.2.jar UploadServlet.java 進行編譯。然后將生成的UploadServlet.class文件放到/var/lib/tomcat8/webapps/myapps/WEB-INF/classes/文件下。
當配置完成后可以在瀏覽器中訪問:http://localhost:8080/myapps/upload.html 進行上傳。
在http上傳程序中可以通過http://localip:8080/myapps/upload來指定上傳的文件url。在測試調試過程中可以查看tomcat的log文件。目錄地址為/var/lib/tomcat8/logs/ 其中以當天日期命名了為log日志,控制台輸出可以在當前目錄使用 tail -f catalina.out 實時看到打印消息。
本文主要參考