其中涉及到的jar包:

jsp显示层:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="${pageContext.servletContext.contextPath }/servlet/UpLoadDemo02" method="POST" enctype="multipart/form-data">
请选择要上传的文件:<input type="file" name="attachment" />
<input type="submit" value="上传文件"/>
</form>
</body>
</html>

servlet中的逻辑:

package upload;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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;
import org.apache.commons.io.FileUtils;
/**
* 我们这里开始使用apache的文件上传和下载的组件
* 1.导入jar包
* commons-fileload-1.2.2.jar
* commons-io-2.1.jar 一个IO流工具(更方便)
* 2.核心的API
* DiskFileItemFactory类:用于设置上传文件的缓存大小和缓存目录。
* servletFileUpload:用于解析上传的所有文件。
* List<FileItem> parseRequest(HttpServletRequest request)
* 返回的FileItem对象:
* 代表一个上传的文件。
* 文件名称
* 文件大小
* 文件类型
* 文件内容
* @author mzy
*
*/
public class UpLoadDemo02 extends HttpServlet { private static final long serialVersionUID = 987003232758385500L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1.创建一个DiskFileItemFactory对象,用于设置缓存大小和缓存目录
/*
* 参数一:缓存大小
* 如果文件大小小于缓存,那么就不通过缓存,直接传到服务器;
* 如果文件大小大于缓存,那么就先把文件存储到缓存目录
* (然后再从缓存目录到指定的目录中:
* 缓存文件的大小等于上传文件的大小,并非等于指定缓存的大小
* 例如文件大小为49KB,缓存大小指定的是10KB,那么缓存中的文件大小为49KB。
* 如果文件大小为9Kb,缓存大小指定的是10KB,那么缓存中没有文件。
* )。
* 参数二:缓存目录
* 可以看出这里的缓存和我们在流中接触到的Buffer之类的不同,这里的缓存是实打实的能在外存找到的
* 系统文件夹中的缓存。
*/ // 单位是b:10KB 给定一个缓存的目录
// 必须要自己先到e:/下:去新建一个temp的目录;才会有文件缓存到e:/temp/ 中去
// 不然会报:java.io.FileNotFoundException: e:\temp\ upload_68564f96_163548425a3__8000_00000003.tmp (系统找不到指定的路径。)
// 注意: 这里加了一个空格 因为\ u 会报错!
DiskFileItemFactory factory = new DiskFileItemFactory(10*1024, new File("e:/temp"));
// 默认的缓存大小就是10KB
// 2.使用servletFileUpLoad解析文件:使用DiskFileItemFactory构造
ServletFileUpload upload = new ServletFileUpload(factory); // 3.解析文件
// 该方法会自动读取请求的实体内容中所有上传文件的信息。
// List:可以是多个文件
List<FileItem> list = upload.parseRequest(request); /*
* 设置文件头编码,来解决某些服务端默认编码造成的中文乱码问题!
*/
upload.setHeaderEncoding("utf-8"); // 将上传的文件的信息读取出来
if(list != null) {
// 取出第一个文件
FileItem item = list.get(0); // 文件信息
/*
* 1.文件名字:
* getName:
* 返回客户端文件系统中的原始文件名;由浏览器
* (或其他客户端软件)提供;但是,一些客户端,
* 如Opera浏览器,包含路径信息。
*
* getFieldName:
* 返回与此文件项对应的多部件表单中的字段名称。
*
* 所以不能使用getFiledName
* 返回的是表单中名称,并不是实际文件的名字!
*/
String name = item.getName(); /*
* 关于item.getName,所以要考虑截取问题!
* 怎么办?
* 我的思路是找到最后一个\的位置进行截取!
* IE下得到的是:
* name = C:\Users\Administrator\Desktop\关于编码和解码的问题.txt
* 火狐内核中:
* name = 关于编码和解码的问题.txt
* google内核中:
* name = 数据库表—DBUtils案例中.PNG
*/
if(name.contains("\\")) {
name = name.substring(name.lastIndexOf("\\")+1, name.length());
} // 文件大小:单位应该是KB
long size = item.getSize();
// 类型
String contentType = item.getContentType();
System.out.println("name = "+name);
System.out.println("size = "+size);
System.out.println("contentType = "+contentType);
/* 输出:
* name = 图片.jpg
* size = 285900
* contentType = image/jpeg
*/ // 文件内容
InputStream in = item.getInputStream(); /* 拿到了inputStream之后,
* 我们可以自己弄一个FileWriter,FileOutoutStream
* 什么的去写文件;也可以使用以下的方法
*
*
* 使用IO流工具:
* 有很多方法,上面提到的那个IO流的jar包
* 其中的FileUtils中的方法。
*
* 提供了很多对文件的操作:
* copyDirectory
* copyFile
* copyURLToFile
* copyDirectoryToDirectory
* copyInputStreamToFile
*/
// 写出到服务器的硬盘上! 必须要先建e:/files/这个目录!
FileUtils.copyInputStreamToFile(in, new File("e:/files/"+name)); /*
* 注意:
* 在我文件上传完成之后,本地的临时文件
* 不会自动删除,所以要我们手动的进行删除!
*/
item.delete();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); doGet(request, response);
} }

模拟文件上传(二):使用apache fileupload组件进行文件上传的更多相关文章

  1. 模拟文件上传(三):使用apache fileupload组件进行文件批量上传

    其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...

  2. 使用 fileupload 组件完成文件的上传应用

    1. 使用 fileupload 组件完成文件的上传应用 commons-dbutils-1.3.jarcommons-fileupload-1.2.1.jar 1). 需求: > 在 uplo ...

  3. jsp实现文件上传(二)用cos组件实现文件上传

    jsp表单 <%@ page language="java" pageEncoding="utf-8"%> <html> <hea ...

  4. java采用Apache FileUpload组件实现上传

    可见:FileItemSteam(servletFileUpload.getItemIterator(httpServletRequest))速度要快于FileItem(servletFileUplo ...

  5. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  6. Apache FileUpload详细介绍

    Apache FileUpload组件 在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".)为 ...

  7. Apache FileUpload实现文件上传

    今天,我来介绍一个Apache FileUpload这个插件的使用. 首先,到官网下载相关jar包点击这里下载,这里提供是v1.2. 1.在项目中导入相关jar包commons-fileupload- ...

  8. (八)利用apache组件进行文件上传下载

    一.文件上传 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理. 1.1 编写html文件 <!DOCTYPE html> ...

  9. dwz+jquery+fileupload+springmvc实现文件上传 及图片预览

    1 前台jsp:文件的上传利用了iframe实现局部刷新功能.使用了apache的fileupload组件,用到的jar: commons-fileupload.jar,commons-io.jarD ...

随机推荐

  1. ajax请求对返回数据data的处理

    1,ajax请求会根据响应头的返回数据类型对返回的数据data变量进行不同的处理 $.get("data/user-permission-submit-" + ddo.manipu ...

  2. 怀疑前端组件把我的excel文件搞坏了,怎么证明

    背景 我在做个需求,用户通过excel上传文件,文件中,每一行就是一条数据,后台批量处理:但是呢,用户填的数据可能有问题,所以我后台想先做个检查,然后在每一行中加一列,来指出这一行存在的问题. 我本来 ...

  3. PphpStorm常用操作整理

    本地修改记录:在项目名称上右键,点击Local History | Show History.你可以看到项目文件各个历史版本:Alt+Shift+C,可以看到项目最近的修改.这就是它的版本集成功能特性 ...

  4. SQL慢查询排查思路

    前言 平时在工作中每天都会做巡检,将前一天所有超过500ms的慢SQL排查出来 查找原因,是否能进行优化.慢慢中,在形成了一套思路方法论. 我个人认为对于排查慢SQL还是有一定的帮助 (一).是否是S ...

  5. 计算机基础-Socket

    计算机基础-Socket 当时明月在,曾照彩云归. 简介:计算机基础-Socket 一.I/O 模型 一个输入操作通常包括两个阶段: 等待数据准备好 从内核向进程复制数据 对于一个套接字上的输入操作, ...

  6. Java程序员必学知识点

    JVM无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在JVM上了) 详细介绍了JVM有关于线 ...

  7. 微信小程序创建第一个项目

    一.打开微信开发者工具,扫码登录 二.点击右侧的加号,添加小程序 第三步:创建成功后,报错 VM82:1 cloud init error: Error: invalid scope 没有权限,请先开 ...

  8. 比POSTMAN更好用!在国产接口调试工具APIPOST中使用Mock

    APIPOST可以让你在没有后端程序的情况下能真实地返回接口数据,你可以用APIPOST实现项目初期纯前端的效果演示,也可以用APIPOST实现开发中的数据模拟从而实现前后端分离.在使用APIPOST ...

  9. Linux 基础指令初识

    Linux 基础指令初识 01. ls 指令 语法: ls [选项] [目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件.对于文件,将列出文件名以及其他信息 -a 列出目录下的所有文 ...

  10. 一张图带你搞懂Javascript原型链关系

    在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...