Web界面实现文件上传, 后台Servlet进行保存与调用.

写的第一篇博客,小菜鸟的成长之路—尽请期待:
该篇思路:
1. 文件上传首先要借助第三方库–commons (而commons-fileupload使用依赖于commons-io),所以要去apache下载两个jar包,并导入到项目的lib目录下.
2. 可以根据commons的用户导向,使用commons-fileupload: —-固定使用步骤

    // Create a factory for disk-based(物理硬盘) file items
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // Configure a repository (to ensure a secure temp location is used)
    ServletContext servletContext = this.getServletConfig().getServl`这里写代码片`etContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);

    // Create a new file upload handler(处理器)
       ServletFileUpload upload = new ServletFileUpload(factory);

    // Parse the request
    List<FileItem> items = upload.parseRequest(request);
  1. 在web页面要指定form表单中方法为post(若上传为图片,则会转化为特殊字符,长度远远大于get方法范围), 且要指定消息头为multipart/form-data; 另外给input类型设为file,给个名字:
    <form action="RegServlet" method="post" enctype="multipart/form-data">
    头&nbsp像: <input type="file" name="photo"/><br/>   
     </form>
  1. 新建一个RegServlet文件, 按照2中的步骤进行书写;
  2. 先获取上传文件的后缀, 自动生成一个前缀,拼接一个要保存的wenjianming(目的:这样就不会重名了,毕竟用户上传的文件名什么情况都有,有可能都建123.jbg 若直接保存不加修改,文件就会重名,且不利于管理.)
  3. 获取输入流–将文件传进来
  4. 获取输出流–将文件传到指定路径( 需要获取要保存的路径,比如说项目中images所在的路径–String path = servletContext.getRealPath(“/images”); //查询images真正的地址)
    8.将注册界面 用户输入信息(包括上传文件–头像图片),保存到数据库, 需要进行判断,用.equels相应的属性名,并赋值;(上传文件可值上传文件名, 路径名不写);然后保存到数据库—下边有详细代码
  5. 要将用户上传文件显示(如:头像),只要在用户显示视图界面–使用EL, 并拼接路径即可( )
  6. 然后就OVER了!
@WebServlet("/RegServlet")   //这是比以前新用的技术--注解; 这样就不用再写繁琐的web.xml配置文件了.
public class RegServlet extends HttpServlet{
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
        //如果是文件上传的form, 不能再使用普通这种方法获取参数
        //String name = request.getParameter("username");
        //System.out.println(name);

    // Create a factory for disk-based(物理硬盘) file items
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // Configure a repository (to ensure a secure temp location is used)
    ServletContext servletContext = this.getServletConfig().getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);

    // Create a new file upload handler(处理器)
    ServletFileUpload upload = new ServletFileUpload(factory);

    // Parse(解析) the request (将request传过来,upload对象会进行解析)
    try {
        User user = new User();
        //文本框叫文本域, file类型的form,一个输入框叫做一个文件域
        //解析时,会将所有的文件选项放到 list集合里边 ; 一个输入框就是一个文件域,一个FileItem
        List<FileItem> items = upload.parseRequest(request);
        for(FileItem item : items) {
            if(item.isFormField()) {  //普通的form 元素
                String fileName = item.getFieldName() ;
                String value = item.getString("utf-8"); 
                if(fileName.equals("username")) {  //对比下,找到对应的属性名, 将对应的属性值添加到对象中 
                    user.setUsername(value);
                }else if(fileName.equals("userpwd")) {
                    user.setUserpwd(value);
                }else if(fileName.equals("email")) {
                    user.setEmail(value);
                }else if(fileName.equals("address")) {
                    user.setAddress(value);
                }else if(fileName.equals("hobby")) {
                    user.setHobby(value);
                }
                //System.out.println(fieldName+":"+value);
            }else {
                //文件对象元素
                String fileName = item.getName(); //得到传入的文件名--目的是得到后缀
                String suffix = fileName.substring(fileName.lastIndexOf('.')); //把后缀
                UUID uuid = UUID.randomUUID(); // 随机生成一串16进制数--作为新文件名的前缀
                String prefix = uuid.toString().replaceAll("-",""); //将数字转化为字符串,并将"-"替换为""
                String saveFileName = prefix+suffix; //拼接新的文件名--为了系统保存,不会重复
                user.setPhoto(saveFileName); //可将最后的文件名保存到数据库, 以后调用显示的时候可链接地址来用
                //System.out.println(fileName);
                //System.out.println(saveFileName);

                //获取文件要保存的地址:
                String path = servletContext.getRealPath("/images"); //查询images真正的地址
                System.out.println(path);

                InputStream is = item.getInputStream(); //获取输入流
                // 输出流 指定将要保存的文件地址--地址是拼接的
                OutputStream os = new FileOutputStream(new File(path+File.separator+saveFileName));
                byte[] b = new byte[1024]; //文件的复制,粘贴 需要一个中间过度容器
                int len;
                while((len = is.read(b))!=-1) { 
                    os.write(b, 0, len);
                }
                is.close();
                os.close();
            }
            UserService userService = new UserServiceImpl();
            boolean result = userService.save(user)>0;
            if(result) {
                response.sendRedirect("LoginPreServlet");
            }
        }
    } catch (FileUploadException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ld_secret/article/details/82527427