jsp上传文件

*<form>标签method属性必须为post,并且添加enctype="multipart/form-data"属性


 
-----------------

servlet接收jsp上传的文件

首先需要导入commons-io-1.1.jar和commons-fileupload-1.1.1.jar两个包

  1). 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
  2). 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
  3). 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);

=========================================
扩展内容
=========================================

上传(上传不能使用BaseServlet)

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="zhaoPian"/><br/>
  <input type="submit" value="上传"/>
</form>
2. 上传对Servlet限制
  * request.getParametere("xxx");这个方法在表单为enctype="multipart/form-data"时,它作废了。它永远都返回null
  * ServletInputStream request.getInputStream();包含整个请求的体!
-------------------------------
多部件表单的体
1. 每隔出多个部件,即一个表单项一个部件。
2. 一个部件中自己包含请求头和空行,以及请求体。
3. 普通表单项:
  > 1个头:Content-Disposition:包含name="xxxx",即表单项名称。
  > 体就是表单项的值
4. 文件表单项:
  > 2个头:
    * Content-Disposition:包含name="xxxx",即表单项名称;还有一个filename="xxx",表示上传文件的名称
    * Content-Type:它是上传文件的MIME类型,例如:image/pjpeg,表示上传的是图片,图上中jpg扩展名的图片。
  > 体就是上传文件的内容。
===========================================
commons-fileupload
  * commons-fileupload.jar
  * commons-io.jar
这个小组件,它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可!
---------------
1. 上传三步
  相关类:
  * 工厂:DiskFileItemFactory
  * 解析器:ServletFileUpload
  * 表单项:FileItem
  1). 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
  2). 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
  3). 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);
2. FileItem
  * boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
  * String getFieldName():返回当前表单项的名称;
  * String getString(String charset):返回表单项的值;
  * String getName():返回上传的文件名称
  * long getSize():返回上传文件的字节数
  * InputStream getInputStream():返回上传文件对应的输入流
  * void write(File destFile):把上传的文件内容保存到指定的文件中。
  * String getContentType();
---------------
上传的细节:
1. 文件必须保存到WEB-INF下!
  * 目的是不让浏览器直接访问到!
  * 把文件保存到WEB-INF目录下!
2. 文件名称相关问题
 * 有的浏览器上传的文件名是绝对路径,这需要切割!C:\files\baibing.jpg
        String filename = fi2.getName();
int index = filename.lastIndexOf("\\");
if(index != -1) {
    filename = filename.substring(index+1);
}
  * 文件名乱码或者普通表单项乱码:request.setCharacterEncoding("utf-8");因为fileupload内部会调用request.getCharacterEncoding();
> request.setCharacterEncoding("utf-8");//优先级低
> servletFileUpload.setHeaderEncoding("utf-8");//优先级高
  * 文件同名问题;我们需要为每个文件添加名称前缀,这个前缀要保证不能重复。uuid
> filename = CommonUtils.uuid() + "_" + filename;
3. 目录打散
  * 不能在一个目录下存放之多文件。
    > 首字符打散:使用文件的首字母做为目录名称,例如:abc.txt,那么我们把文件保存到a目录下。如果a目录这时不存在,那么创建之。
    > 时间打散:使用当前日期做为目录。
    > 哈希打散:
      * 通过文件名称得到int值,即调用hashCode()
      * 它int值转换成16进制0~9, A~F
      * 获取16进制的前两位用来生成目录,目录为二层!例如:1B2C3D4E5F,/1/B/保存文件。
4. 上传文件的大小限制
  * 单个文件大小限制
    > sfu.setFileSizeMax(100*1024):限制单个文件大小为100KB
    > 上面的方法调用,必须在解析开始之前调用!
    > 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.FileSizeLimitExceededException
  * 整个请求所有数据大小限制
    > sfu.setSizeMax(1024 * 1024);//限制整个表单大小为1M
    > 这个方法也是必须在parseRequest()方法之前调用
    > 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.SizeLimitExceededException
5. 缓存大小与临时目录
  * 缓存大小:超出多大,才向硬盘保存!默认为10KB
  * 临时目录:向硬盘的什么目录保存
  设置缓存大小与临时目录:new DiskFileItemFactory(20*1024, new File("F:/temp"))

JavaWeb笔记——上传文件的更多相关文章

  1. PHP学习笔记——上传文件到服务端的文件夹下

    环境 开发包:appserv-win32-2.5.10 服务器:Apache2.2 数据库:phpMyAdmin 语言:php5,java 平台:windows 10 需求 编写一个PHP脚本页面,可 ...

  2. JavaWeb实现上传文件

    需要 commons-io与commons-fileupload 首先在jsp中创建一下布局 <%@ page contentType="text/html;charset=UTF-8 ...

  3. javaWeb中使用ajax上传文件

    javaWeb上传图片 上传文件所必要的两个jar包:commons-fileupload.jar.commons-io.jar. jar包下载:github路径 核心代码: String withP ...

  4. Javaweb学习笔记——上传下载文件

    一.前言 在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为comm ...

  5. JAVAWeb SSH框架 上传文件,如2007的EXCEL

    下面的代码是上传EXCEL的代码,其实,就是在上传文件到服务器,代码都差不多,只是接收的文件的类型改一下即可. 1.jsp 用的是struts2 标签 代码: <s:file name=&quo ...

  6. Python3+Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)'''from seleni ...

  7. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  8. 【要什么自行车】ASP.NET MVC4笔记02:上传文件 uploadify 组件使用

    参考:http://www.cnblogs.com/luotaoyeah/p/3321070.html 1.下载 uploadify 组件,copy至 Content文件夹 <link href ...

  9. Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

    目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能---- ...

随机推荐

  1. mysql 创建一个用户,指定一个数据库

    mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -p password use mysql; insert into use ...

  2. sqlite与C++进行连接

    SQLite数据库是零配置的,sqlite数据库不同于SqlServer等数据库,SQLite不需要复杂配置,只需要,将SQLite的库文件和动态链接文件拷贝到相应工程目录下,就可以使用SQLite数 ...

  3. iTween基础之Fade(淡入淡出)

    一.基础介绍:二.基础属性 原文地址: http://blog.csdn.net/dingkun520wy/article/details/50923665 一.基础介绍 FadeTo:从当前透明度变 ...

  4. xml基础学习笔记04

    今天继续xml学习,主要是:SimpleXML快速解析文档.xml与数组相互转换 .博客中只是简单的做一个学习记录.积累.更加详细的使用方法,可以查看php手册 1.SimpleXML快速解析文档 前 ...

  5. 【Django】Django命令(Manager.py)

    django-admin.py startproject mysite 该命令在当前目录创建一个 mysite 目录. django-admin.py这个文件在C:\Python27\Lib\site ...

  6. appium for windows 环境搭建

    服务环境: 1 安装Nodejs 下载nodejs安装包(http://nodejs.org/download/)安装 测试安装是否成功:运行cmd,输入node -v 2 安装android的SKD ...

  7. css3 的content 属性

    content属性想必大家都熟悉了,一般结合伪类一起使用,表示显示的内容 例如:.box:before{content:"hello";width:100px;line-heigh ...

  8. hdu 3549 Flow Problem 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Network flow is a well-known difficult problem f ...

  9. NYOJ-244 16进制的简单运算 AC 分类: NYOJ 2014-01-17 21:11 195人阅读 评论(0) 收藏

    #include<stdio.h> int main() { long x,y; char op; int t; scanf("%d ", &t); while ...

  10. 项目分析(PLUG)

    plug过程 .INIT_PLUG #define INIT_PLUG Plug::InitPlug g_InitPlug(true); //共享内存数据结构 struct PlugShareMemo ...