javaweb文件上传

文件上传

在项目中,文件的上传是常见的功能。很多程序或者软件中都经常使用到文件的上传。

  • 邮箱中有附件的上传;
  • 图片上传。

当用户在前端页面点击文件上传后,用户上传的文件数据提交给服务器端,实现保存。

1._上传对表单的限制

  • method="post"
  • enctype="multipart/form-data"
  • 表单中需要添加文件表单项:<input type="file" name="xxx" />
<form action="xxx" method="post" enctype="multipart/form-data">
  用户名;<input type="text" name="username"/><br/>
  照 片:<input type="file" name="photo"/><br/>
  <input type="submit" value="上传"/>
</form>

2._上传对Servlet的限制

request.getParameter("xxx")这个方法在表单为enctype="multipart/form-data"时,它作废了,它永远都返回null

3._实现文件上传如何实现文件上传

3.1._相关Jar包

它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可。

3.2._实例

  1. 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory()

  2. 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory)

  3. 使用解析器来解析request,得到FileItem集合:

    List<FileItem> fileItemList = sfu.parseRequest(request)

    FileItem中常用方法:

    • boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项
    • String getFieldName():返回当前表单项的名称;
    • String getString(String charset):返回表单项的值;
    • String getName():返回上传的文件名称;
    • long getSize():返回上传文件的字节数;
    • InputStream getInputStream():返回上传文件对应的输入流;
    • void write(File destFile):把上传的文件内容保存到指定的文件中。

3.3._具体步骤

//创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建解析器
ServletFileUpload sfu = new ServletFileUpload(factory);

//文件名或普通表单项乱码 两个方案二选一
request.setCharacterEncoding("utf-8");
//sfu.setHeaderEncoding("utf-8");

try {
    //使用解析器来解析request,得到FileItem集合
    List<FileItem> list = sfu.parseRequest(request);
    for (FileItem item : list) {
        if(item.isFormField()) {
            String fieldName = item.getFieldName();
            String value = item.getString("utf-8");
            System.out.println(fieldName + ":" + value);
        } else {
            String fileName = item.getName();
            long size = item.getSize();
            System.out.println("文件名:" + fileName);
            System.out.println("文件大小" + size);
            
            ServletContext servletContext = this.getServletConfig().getServletContext();
            String realPath = servletContext.getRealPath("/img");
            
            // 同名文件上传问题
            item.write(new File(realPath + 
                                "/" + 
                                UUID.randomUUID().toString().replace("-", "") + 
                                "_" + 
                                fileName));
        }
    }
} catch (FileUploadException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/af3957f27e074e70a96de640be5d46ad.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA54af5oKJ55qE5paw6aOO5pmv,size_9,color_FFFFFF,t_70,g_se,x_16)

posted @ 2022-04-02 09:46  coderwcb  阅读(103)  评论(0编辑  收藏  举报