解決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; } }
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>
其他頁面略
e、上傳成功后,想要顯示,你使用的路徑將是配置的那個虛擬路徑,不需要多余的寫法,如我這里,直接寫:/upload,至於upload后面的目錄路徑,就根據需要了。
像我這里,因為我使用的是用戶id創建,所以用戶每次登陸,我令他去找自己的目錄就行了,而根目錄就是你配置的目錄。
總結:在個人計算機上像上面這樣寫就行;而想要在服務器上配置,基本就是只需要配置tomcat和在服務器中創建一個屬於存儲照片的目錄,
從而是想服務器目錄<-->server.xml<---->servlet<---->jsp,形成一個完整的映射。