一、文件上传

1.1、概述

实现web开发中的文件上传功能,需完成如下二步操作:

  • 在web页面中添加上传输入项
  • 在servlet中读取上传文件的数据,并保存到本地硬盘中

如何在web页面中添加上传输入项?

<input type="file"> 标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意:
1、必须要设置 input 输入项的 name 属性,否则浏览器将不会发送上传文件的数据。
2、必须把form的 enctype 属值设为 multipart/form-data ,这样浏览器在上传文件时,才会把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

如果表单的提交类型为multipart/form-data,那么表单的数据将不能通过传统方式获得。如何获得?如何在Servlet中读取文件上传数据,并保存到本地硬盘中?

Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作。

为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件 Commons-fileupload ,该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。

使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。

1.2、fileupload组件工作流程

核心API—DiskFileItemFactory

  常用方法有:

  • public void setSizeThreshold(int sizeThreshold)    设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。
  • public void setRepository(java.io.File repository)    指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").
  • public DiskFileItemFactory(int sizeThreshold, java.io.File repository)   构造函数

核心API—ServletFileUpload 

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

  • boolean isMultipartContent(HttpServletRequest request)  判断上传表单是否为multipart/form-data类型
  • List parseRequest(HttpServletRequest request)  解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
  • setFileSizeMax(long fileSizeMax)  设置上传文件的最大值
  • setSizeMax(long sizeMax)  设置上传文件总量的最大值
  • setHeaderEncoding(java.lang.String encoding)  设置编码格式
  • setProgressListener(ProgressListener pListener)

1.3、文件上传案例

  实现步骤

  1. 创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
  2. 使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
  3. 调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
  4. 对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件,若为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值,若为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。

上传页面upload.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.request.contextPath }/servlet/UploadServlet"
enctype="multipart/form-data" method="post">
上传用户:&nbsp;&nbsp;<input type="text" name="username"><br>
上传文件1:<input type="file" name="uploadfile1"><br>
上传文件2:<input type="file" name="uploadfile2"><br> <input type="reset" value="重置"><br>
<input type="submit" value="上传">
</form>
</body>
</html>

后台UploadServlet.java

 public class UploadServlet extends HttpServlet {

     public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
//上传目录
String webroot = this.getServletContext().getRealPath("/");
File uploadDir = new File(webroot + "upload");
if(!uploadDir.exists()){
uploadDir.mkdirs();
}
try{
DiskFileItemFactory factory = new DiskFileItemFactory(); //调用解析器解析request
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
if(!servletFileUpload.isMultipartContent(request)){
//按照传统方式获取request表单数据
request.getParameter("username");
return;
}
List<FileItem> list = servletFileUpload.parseRequest(request);
for(FileItem item : list){
//判断字段类型
if(item.isFormField()){
//表单字段
String fieldname = item.getFieldName();
String value = item.getString();
writer.println(fieldname + ":" + value);
}else{
//上传文件
String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1);
File uploadFile = new File(uploadDir, filename);
writer.println("上传文件:"+uploadFile.getAbsolutePath());
//读写
InputStream in = item.getInputStream();
OutputStream out = new FileOutputStream(uploadFile);
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))>0){
out.write(buf,0,len);
}
out.close();
in.close();
}
}
writer.println("上传完毕");
}catch (Exception e) {
throw new RuntimeException(e);
}
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
} }

提交后显示浏览器显示

二、文件下载

  程序实现下载需设置两个响应头:设置Content-Type 的值为:application/x-msdownload。Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件;Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type

 public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8"); String filename = "1.jpg";
//下载头
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); String imgPath = this.getServletContext().getRealPath("/upload/1.jpg"); InputStream in = new FileInputStream(new File(imgPath));
OutputStream out = response.getOutputStream();
byte[] bytes = new byte[1024];
while(in.read(bytes) > 0){
out.write(bytes);
}
in.close();
}
}

jsp页面

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件下载案例</title>
</head>
<body>
<a href="servlet/downloadServlet">文件下载</a>
</body>
</html>

【JavaWeb学习】文件的上传和下载的更多相关文章

  1. JavaWeb中文件的上传和下载

    JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...

  2. Javaweb之文件的上传与下载

    Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...

  3. JAVAWEB之文件的上传和下载

    一.文件的上传: Enctype的属性介绍: 基于表单文件上传的界面简介: 文件上传时服务器端获取不到请求信息的原因及获取请求信息的几种方式: 输入流方式的实现: 实用工具包的实现:要导入fileup ...

  4. JavaWeb 之文件的上传下载

    又到了每周更新博客的时候了,每看到自己发布的随笔阅读量上涨的时候就特别开心,我也会尽自己的努力提高自己的水平,总结出通俗易读的学习笔记,还望大家能多多支持!!! ------------------- ...

  5. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  6. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  7. Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载

    Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...

  8. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  9. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  10. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

随机推荐

  1. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  2. Keil> 编译器特有的功能 > 关键字和运算符 > __weak

    __weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...

  3. 在DevExpress中使用CameraControl控件进行摄像头图像采集

    在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像 ...

  4. LINQ to SQL语句(6)之Group By/Having

    适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in db.Products group ...

  5. 【.NET MF】.NET Micro Framework USB移植

    1.开发环境 windows 7  32位 MDK 4.54 .Net Micro Framework Porting Kit 4.2(RTM QFE2) .Net Micro Framework   ...

  6. Linux安装jdk

    查看Java的版本命令:java -version 查看java版本的方法是:运行--->cmd,输入java –version.注意: java命令后是有个空格的,-version表示参数而已 ...

  7. storm0.9.5集群安装

    安装前的准备工作 关闭防火墙 chkconfig iptables off && setenforce 0 创建用户 groupadd realtime && user ...

  8. jsPanel插件Option总结

    jsPanel插件Option总结 学习jsPanel之余对相关的选项进行了总结,便于参考. # 选项名称 类别 简要说明 1 autoclose configuration 设置一个时间在毫秒后,面 ...

  9. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  10. ArcGIS Engine开发之鹰眼视图

    鹰眼是GIS软件的必备功能之一.它是一个MapControl控件,主要用来表示数据视图中的地理范围在全图中的位置. 鹰眼一般具有的功能: 1)鹰眼视图与数据视图的地理范围保持同步. 2)数据视图的当前 ...