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. 在本地环境用虚拟机win2008 sever搭建VS2013 + SVN 代码版本控制环境

    此文仅仅是自己笔记做个备忘.因为自己开发一些中小型的软件经常需要修修改改,特别是winform界面的大改动.经常需要对版本进行管理.而租用分布式服务器和远程服务器都不是自己想要的.本文结合虚拟机 + ...

  2. js之Function原型

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...

  3. android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好

    public void startRecord() { mediarecorder = new MediaRecorder();// 创建mediarecorder对象 mCamera = getCa ...

  4. sudo su 提示没有配置JDK environment

    sudo su 提示没有配置JDK environment 最近工作遇到一问题,我通过SecureCRT远程登录服务器,部署web应用.将变更文件替换后,我需要切换到root用户,重启Tomcat.所 ...

  5. linshiwendang12--匈牙利

    #include<bits/stdc++.h> #define N 10007 using namespace std; vector<int> p[N]; bool vis[ ...

  6. LAMP环境的搭建

    [一些前言废话]一名web开发尤其是后端不懂LAMP环境的搭建,那就摊上事了,有些人说他一直用win下的wampServer这种傻瓜式环境搭建,用的挺好的,也有人说他用云服务器,搭配“一键搭建LAMP ...

  7. 实现IDisposable接口的模式

    代码: public class Class2 : IDisposable { ~Class2() { Dispose(false); } public void Dispose() { Dispos ...

  8. JS模板引擎 :ArtTemplate (1)

    1.为什么需要用到模板引擎 我们在做前端开发的时候,有时候经常需要根据后端返回的json数据,然后来生成html,再显示到页面中去. 例如这样子: var data = [ {text: " ...

  9. C++中的RAII机制

    http://www.jellythink.com/archives/101 前言 在写C++设计模式——单例模式的时候,在写到实例销毁时,设计的GC类是很巧妙的,而这一巧妙的设计就是根据当对象的生命 ...

  10. 分布式数据存储 - MySQL主从复制高可用方案

    前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可 ...