zoukankan      html  css  js  c++  java
  • javaweb解决上传文件目录问题【*****】

    解决javaweb上传的文件不知道去向,或者知道去向,但不能永久保存的问题:

    一、对tomcat的server.xml文件的设置;

    二、在servlet读取文件目录时。直接填真实配置的路径;

    以上,就解决了路径上传文件的路径映射问题。具体方法:

    (这是在windows环境下的配置,如果放到服务器,我想也就该一下路径问题就行了):

    1、在tomcat的conf目录下,找到server.xml,然后在最后面的value标签前面加上:

    <Context path="upload" docBase="c: emp1upload" 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,形成一个完整的映射。

  • 相关阅读:
    angularjs学习笔记一之显示数据,修改数据
    收藏/不再提醒
    CSS3动画
    Content-Type
    键盘快捷键
    url、href、src 详解
    关于docnment.write() 会清空原来的内容
    jq事件注意点
    echart的自适应
    键盘事件
  • 原文地址:https://www.cnblogs.com/ciscolee/p/13045569.html
Copyright © 2011-2022 走看看