javaweb解決上傳文件目錄問題【*****】


解決javaweb上傳的文件不知道去向,或者知道去向,但不能永久保存的問題:

一、對tomcat的server.xml文件的設置;

二、在servlet讀取文件目錄時。直接填真實配置的路徑;

以上,就解決了路徑上傳文件的路徑映射問題。具體方法:

(這是在windows環境下的配置,如果放到服務器,我想也就該一下路徑問題就行了):

1、在tomcat的conf目錄下,找到server.xml,然后在最后面的value標簽前面加上:

<Context path="upload" docBase="c:\temp1\upload" crossContext="true" reloadable="false" debug="0"/>

2、在eclipse中,雙擊Servers下面的tomcat服務-->點擊Overview旁邊的Modules-->點擊Add External Web Modules...---》填寫:

Document Base 和 Path 如圖所示:

最后填完后顯示的是第一張圖的樣子,其中包含C盤路徑的那一條記錄便是。

3、重啟服務,刷新網頁就能看到成功

下面是我測試的例子:

a、server.xml配置【上面已有,略】

b、web.xml同樣略【這個沒有多余配置,只要你會servlet,我想都不用多想】

c、包含協議的servlet類才是關鍵:

package servlet;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import table.ImagePath;


/** 
* @author mac 
* @version 1.0 
* 注意:上傳文件必須添加@MultipartConfig()可以設置上傳文件的大小
*/
@WebServlet("/upload")//別名,jsp頁面使用,起到 隱藏真實路徑的效果,當然,他代表的是UploadSpotImgServlet這個類
@MultipartConfig
public class UploadSpotImgServlet extends HttpServlet{

    
    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        try {
            //獲取文件描述信息
            String desc=request.getParameter("desc");
            //獲取上傳的文件
            Part part=request.getPart("file");
            //獲取請求的信息
            String name=part.getHeader("content-disposition");
            //System.out.println(name);//測試使用
            //System.out.println(desc);//
            
            //獲取上傳文件的根目錄
            String root="c:/temp1/upload";//request.getServletContext().getRealPath("/upload");
            //獲取用戶id,並以id創建文件夾
            String uid = request.getParameter("uid");
            String userRoot = createFile(root+"\\"+uid);
            System.out.println("用戶cisco的"+"測試上傳文件的路徑:"+userRoot);
            
            //獲取文件的后綴
            String str=name.substring(name.lastIndexOf("."), name.length()-1);
            System.out.println("測試獲取文件的后綴:"+str);
            
            //生成一個新的文件名,不重復,數據庫存儲的就是這個文件名,不重復的
            //生成用戶的一個新的文件名
            String fileuser = userRoot+"\\"+UUID.randomUUID().toString()+str;
            System.out.println("測試產生新的文件名用戶文件:"+fileuser);
            
            //上傳文件到指定目錄,不想上傳文件就不調用這個
            part.write(fileuser);
            
            //獲取文件夾下的所有文件名
            //ReadFile.readfile(userRoot);
            //
            System.out.println("獲取所有的文件名");
            JSONArray fileNames = readfile(userRoot);
            System.out.println(fileNames);
            for (int i = 0; i < fileNames.size(); i++) {
                System.out.println(fileNames.get(i));
            }
            request.setAttribute("info", "上傳文件成功");
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("info", "上傳文件失敗");
        }
        
        request.getRequestDispatcher("/fileupload.jsp").forward(request, response);
    }
    /**
     * @see FileName是創建文件夾,請以用戶id為文件夾
     * @param FileName
     */
    protected String createFile(String FileName) {
        File file=new File(FileName);
        if(!file.exists()){//如果文件夾不存在
            file.mkdir();//創建文件夾
        }
        //返回文件夾的名字
        return FileName;
    }
    //獲取文件夾下所有的文件名,並json化
    protected JSONArray readfile(String filepath) {
        JSONArray array = new JSONArray();
         try {

             File file = new File(filepath);
             if (!file.isDirectory()) {
                     System.out.println("文件");
                     System.out.println("path=" + file.getPath());
                     System.out.println("absolutepath=" + file.getAbsolutePath());
                     System.out.println("name=" + file.getName());

             } else if (file.isDirectory()) {
                     System.out.println("文件夾");
                     String[] filelist = file.list();
                     for (int i = 0; i < filelist.length; i++) {
                             File readfile = new File(filepath + "\\" + filelist[i]);
                             if (!readfile.isDirectory()) {
                                     System.out.println("path=" + readfile.getPath());
                                     System.out.println("absolutepath="
                                                     + readfile.getAbsolutePath());
                                     System.out.println("name=" + readfile.getName());
                                     ImagePath imagePath = new ImagePath();
                                     imagePath.setPath(readfile.getName());
                                     array.add(JSONObject.fromObject(imagePath));
                             } else if (readfile.isDirectory()) {
                                 readfile(filepath + "\\" + filelist[i]);
                             }
                     }

             }

     } catch (Exception e) {
             System.out.println("readfile()   Exception:" + e.getMessage());
     }
        return array;
    }
}
View Code

d、文件上傳頁面的form標簽:

<form action="upload" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td></td>
            <td><h1>文件上傳</h1></td>
        </tr>
        <tr>
            <td>文件描述:</td>
            <td><input type="text" name="desc"/></td>
        </tr>
        <tr>
            <td>用戶id:</td>
            <td><input type="text" name="uid"/></td>
        </tr>
        <tr>
            <td>上傳文件:</td>
            <td><input type="file" name="file"/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="上傳文件"/></td>
        </tr>
    </table>
</form>
View Code

其他頁面略

e、上傳成功后,想要顯示,你使用的路徑將是配置的那個虛擬路徑,不需要多余的寫法,如我這里,直接寫:/upload,至於upload后面的目錄路徑,就根據需要了。

像我這里,因為我使用的是用戶id創建,所以用戶每次登陸,我令他去找自己的目錄就行了,而根目錄就是你配置的目錄。

 

總結:在個人計算機上像上面這樣寫就行;而想要在服務器上配置,基本就是只需要配置tomcat和在服務器中創建一個屬於存儲照片的目錄,

從而是想服務器目錄<-->server.xml<---->servlet<---->jsp,形成一個完整的映射。


免責聲明!

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



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