获取表单文件,并保存在本地(Servlet)

jsp文件信息

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>物物交换——*图片上传*——百鬼夜行</title>
  </head>
  
  <body>
    <form action="<%=path %>/servlet/UserPhotoSer" enctype="multipart/form-data" method="post">
        <input type="text" name="type" value="0" style="display: none;" />
        <table>
            <tr>
                <td>账号:<input type="text" name="account" /></td>
            </tr>
            <tr>
                <td>选择照片:<input type="file" name="file1" /></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交"/></td>
            </tr>
        </table>
    </form>
  </body>
</html>

Servlet代码

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8"); // 设置编码

        // 获得磁盘文件条目工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        
        //判断图片的存放位置
        String HCpath = this.getServletContext().getRealPath("/uploads/upgoods");


        // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
        // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
        /**
         * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem
         * 格式的 然后再将其真正写到 对应目录的硬盘上
         */
        factory.setRepository(new File(HCpath));
        // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
        factory.setSizeThreshold(1024 * 1024);

        // 高水平的API文件上传处理
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // 可以上传多个文件
            List<FileItem> list = (List<FileItem>) upload.parseRequest(request);

            for (FileItem item : list) {
                // 获取表单的属性名字
                String name = item.getFieldName();

                // 如果获取的 表单信息是普通的 文本 信息
                if (item.isFormField()) {
                    // 获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
                    String value = item.getString();

                    request.setAttribute(name, value);
                }
                // 对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
                else {
                    //也给用用以下方法获取原文件的名称+后缀
//                    //获取路径名  
//                    String value = item.getName() ;  
//                    //索引到最后一个反斜杠  
//                    int start = value.lastIndexOf("\");  
//                    //截取 上传文件的 字符串名字,加1是 去掉反斜杠,  
//                    String filename = value.substring(start+1);  
                    
                    
                    System.out.println("获取上传文件的总共的容量:" + item.getSize());
                    if(item.getSize() == 0){
                        System.out.println("未选择图片");
                        request.setAttribute("imageUrl", "图片错误,可能未选择图片");
                        break;
                    }
                    String path = null;
                    int type = Integer.parseInt((String) request.getAttribute("type"));
                    String imageUrl=null;
                    //根据获取的种类不同存放不同的文件夹路径
                    switch (type) {
                    case 0: imageUrl = "/images/uploads";path = this.getServletContext().getRealPath(imageUrl);break;
                    case 1: imageUrl = "/images/upgoods";path = this.getServletContext().getRealPath(imageUrl);break;
                    case 2: imageUrl = "/images/upusers";path = this.getServletContext().getRealPath(imageUrl);break;
                    default:path = this.getServletContext().getRealPath("/images/uploads");break;
                    }
                    //获取账号
                    String account = (String) request.getAttribute("account");
                    System.out.println(account);
                    //获取当前时间
                    Date now = new Date();
                    //设置时间的格式
                    SimpleDateFormat dateFormat = new SimpleDateFormat(
                            "yyyyMMddHHmmss");
                    String fileTime = dateFormat.format(now);
                    System.out.println(fileTime);
                    //设置文件的名称为 账号+时间+.jpg
                    String filename = account + fileTime + ".jpg";
                    request.setAttribute(name, filename);
                    String Urlpath = request.getContextPath();
                    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+Urlpath;
                    request.setAttribute("imageUrl", basePath+imageUrl+ "\"+filename);
                    // 真正写到磁盘上
                    // 它抛出的异常 用exception 捕捉

                    // item.write( new File(path,filename) );//第三方提供的

                    // 手动写的

                    
                    OutputStream out = new FileOutputStream(new File(path,
                            filename));

                    InputStream in = item.getInputStream();

                    int length = 0;
                    byte[] buf = new byte[1024];
//
//                    System.out.println("获取上传文件的总共的容量:" + item.getSize());
//                    if(item.getSize() == 0){
//                        System.out.println("未");
//                        break;
//                    }

                    // in.read(buf) 每次读到的数据存放在 buf 数组中
                    while ((length = in.read(buf)) != -1) {
                        // 在 buf 数组中 取出数据 写到 (输出流)磁盘上
                        out.write(buf, 0, length);

                    }

                    in.close();
                    out.close();
                }
            }

        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block

            // e.printStackTrace();
        }

         request.getRequestDispatcher("/return_Info/imageUrl.jsp").forward(request,response);
    }

跳转到imagerUrl会显示图片的地址.

以上为自己比着做出的例子,具体

可参考原网址:http://blog.csdn.net/hzc543806053/article/details/7524491

原文地址:https://www.cnblogs.com/SangBigYe/p/3249740.html