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; } }
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,形成一个完整的映射。