JavaWeb---文件上传

目录

1.文件上传的作用

2.文件上传对页面的要求

 3.fileupload

 4.简单上传示例


1.文件上传的作用

   在现实中,我们经常需要客户端向服务器上传一些资源,比如,我们使用QQ时,可以设置头像,那我们就需要从我们本地电脑(客户端)向QQ服务器来上传我们喜欢的头像.还比如现在很流行的百度云盘,也需要我们往百度云盘的服务器上传资源,比如小电影,小图片等等。

2.文件上传对页面的要求

前端要求:

1.form 提交方式:post method="post"

2.form的enctype="application/x-www-form-urlencoded"默认值, 对表单的数据进行url编码,

enctype设置为: multipart/form-data

3.使用 选择文件

    
用户名:
文件1:
文件2:
 

后端要求:

1.获取请求参数, request.getParameter()一组失效

2. 导入commons-fileupload.jar commons-io

1.导入jar: commons-fileupload.jar commons-io.jar  

 

2.编写servlet代码

Fileupload的核心类: DiskFileItemFactory(产生FiledItem的工厂)、ServletFileUpload(解析request,得到FiledItem)、FiledItem(对应的表单的input,select)。

request.getParameter() 方法失效

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

  2. 通过工厂对象, 创建ServletFileUpload对象: ServletFileUpload servletFileUpload = new ServletFileUpload(factory )

  3. 使用ServletFileUpload对象解析request对象

List servletFileUpload .parseRequest(request);  

  DiskFileItemFactory factory = new DiskFileItemFactory();//2.通过工厂得到ServletFileUpload对象ServletFileUpload servletFileUpload = new ServletFileUpload(factory);try {//3.解析requestList fileItems = servletFileUpload.parseRequest(request);} catch (FileUploadException e) {e.printStackTrace();} 

上传文件细节:

  1. 数据库表存的上传文件的保存路径

  2. 上传的文件,保存到服务器的硬盘, 保存的文件的文件名直接上传文件名,出现问题,如果用户上传的文件名在服务器硬盘已存在, 后面的文件覆盖前面的, 解决方案: 保存的文件的文件名由服务器分配, 分配策略唯一: 时间戳 , UUID

 3.fileupload

fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。

fileupload组件需要的JAR包有:

commons-fileupload.jar,核心包;

commons-io.jar,依赖包。

 fileupload方法:

  • String getName():获取文件字段的文件名称;

  • String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;

  • String getFieldName():获取字段名称,例如:,返回的是username;

  • String getContentType():获取上传的文件的类型,例如:text/plain。

  • int getSize():获取上传文件的大小;

  • boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;

  • InputStream getInputStream():获取上传文件对应的输入流;

  • void write(File):把上传的文件保存到指定文件中。

 4.简单上传示例

需求:

  1. 表单包含一个用户名字段,以及一个文件字段;

  2. Servlet保存上传的文件到uploads目录,显示用户名,文件名,文件大小,文件类型。

代码编写:

第一步:

完成index.jsp,只需要一个表单。注意表单必须是post的,而且enctype必须是mulitpart/form-data的。

   
用户名:
文件1:

第二步:

完成FileUploadServlet

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 因为要使用response打印,所以设置其编码response.setContentType("text/html;charset=utf-8");// 创建工厂DiskFileItemFactory dfif = new DiskFileItemFactory();// 使用工厂创建解析器对象ServletFileUpload fileUpload = new ServletFileUpload(dfif);try {// 使用解析器对象解析request,得到FileItem列表List list = fileUpload.parseRequest(request);// 遍历所有表单项for(FileItem fileItem : list) {// 如果当前表单项为普通表单项if(fileItem.isFormField()) {// 获取当前表单项的字段名称String fieldName = fileItem.getFieldName();// 如果当前表单项的字段名为usernameif(fieldName.equals("username")) {// 打印当前表单项的内容,即用户在username表单项中输入的内容response.getWriter().print("用户名:" + fileItem.getString() + "
");}} else {//如果当前表单项不是普通表单项,说明就是文件字段String name = fileItem.getName();//获取上传文件的名称// 如果上传的文件名称为空,即没有指定上传文件if(name == null || name.isEmpty()) {continue;}// 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在String savepath = this.getServletContext().getRealPath("/uploads");// 通过uploads目录和文件名称来创建File对象File file = new File(savepath, name);// 把上传文件保存到指定位置fileItem.write(file);// 打印上传文件的名称response.getWriter().print("上传文件名:" + name + "
");// 打印上传文件的大小response.getWriter().print("上传文件大小:" + fileItem.getSize() + "
");// 打印上传文件的类型response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "
");}}} catch (Exception e) {throw new ServletException(e);} }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部