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

posted @ 2020-06-04 19:22  CiscoLee  阅读(807)  评论(0编辑  收藏  举报