Web應用服務器搭建,接受post文件上傳方式並保存文件。


  文件測試客戶端需要通過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-io-2.5.jar 

            --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 實時看到打印消息。 

本文主要參考

http://haolloyin.blog.51cto.com/1177454/368162/

http://www.runoob.com/servlet/servlet-file-uploading.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM