004——使用servlet实现文件上传功能
来源:互联网 发布:网络三巨头是什么意思 编辑:程序博客网 时间:2024/06/01 19:08
文件上传的要求:
- 必须使用表单
- 表单的method是post
- 表单的enctype必须是multipart/form-data
对servlet的要求:文件上传的表单数据都封装到request对象中
- request.getParameter(String)方法只能获取字符内容,不是字节内容
- 使用request的getInputStream()方法获取ServletInputStream对象(是InputStream的子类)
- commons-fileupload是对ServletInputStream对象的解析
commons-fileupload:
- 核心包:commons-fileupload.jar
- 依赖包:commons-io.jar
fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem
- 创建工厂类对象DiskFileItemFactory:DiskFileItemFactory dfif = new DiskFileItemFactory()
- 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(dfif)
- 使用解析器解析request对象:List<FileItem> list = fileUpload.parseRequest(request)
FileItem:
一个FileItem对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用FileItem类的isFormField()方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了
l String getName():获取文件字段的名称;
l String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;
l String getFieldName():获取字段名称,例如:<inputtype=”text” name=”username”/>,返回的是username;
l String getContentType():获取上传的文件的类型,例如:text/plain。
l int getSize():获取上传文件的大小;
l boolean isFormField():判断当前表单字段的文本类型:如果是普通文本字段返回true,否则是文件字段返回false;
l InputStream getInputStream():获取上传文件对应的输入流;
l void write(File):把上传的文件保存到指定文件中。
上传页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%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> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"> </head> <body><div align="center"><form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username"><br/>文件1:<input type="file" name="file1"><br/><input type="submit" value="提交"></form></div> </body></html>
文件解析代码
package com.java.fileUpload;import java.io.File;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class FileUploadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//创建工厂DiskFileItemFactory disk = new DiskFileItemFactory();//使用工厂创建解析器对象ServletFileUpload fileUpload = new ServletFileUpload(disk);try {//使用解析器对象解析request,得到FileItem列表List<FileItem> 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() + "<br/>");}} 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 + "<br/>");//打印上传文件的大小response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>"); //打印上传文件的类型response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>");}}} catch (Exception e) {throw new ServletException(e);}}}配置文件:
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>FileUploadServlet</servlet-name> <servlet-class>com.java.fileUpload.FileUploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FileUploadServlet</servlet-name> <url-pattern>/FileUploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
0 0
- 004——使用servlet实现文件上传功能
- 使用Servlet实现文件上传功能
- CKEditor使用及开启文件上传功能(Servlet实现)
- 使用Servlet实现文件上传
- Jsp+Servlet文件上传功能实现
- flex4+servlet 实现文件上传功能
- Servlet文件上传功能的实现
- Servlet文件上传功能的实现!
- Servlet实现多文件上传的功能
- Servlet简单实现文件上传功能
- jsp+servlet实现文件的上传功能
- 文件上传——servlet实现
- 网页文件上传问题—servlet实现
- (jsp和Servlet 功能篇) Servlet 实现文件上传
- java—servlet实现文件下载功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 【C++】Modbus通讯
- 面向对象之单例设计模式
- watchOS 1教程
- CSS外部样式表+伪选择器
- 《Noisy Activation Function》噪声激活函数(一)
- 004——使用servlet实现文件上传功能
- 2.5、Hello World入门
- 设计模式 - 代理模式
- java 单例模式的7种实现方法
- Android 2D绘图解析之 Canvas,Paint
- (OK)(OK) NS3 - Genymotion - Android
- OpenVPN服务搭建
- zookeeper 安装 windows环境
- mongodb分片部署和管理