1、什么是上传和下载?

-  数据上传是指客户端向服务器上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指的是客户端向服务器上传文件。即将保存在客户端的文件上传至服务器中的一个副本,保存到服务器中。

-   数据下载是指客户端从服务器上获取数据的过程。文件下载是数据下载的一种特例,指的是客户端从服务器下载文件,即将原来保存在服务器中的文件下载到客户端中一个副本保存。通常我们对服务器所发出的请求,大多数是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,然后由客户端浏览器对这些文件进行解析后,才可能看到这些多媒体信息。

-  但是我们这里所说的文件下载,指的是文件从服务器下载到浏览器后,浏览器并不直接解析,而是以附件的形式保存到客户端中。

-  上传与下载的文件可以是文本文件、图片、声音、视频等各种类型。

2、文件上传的实现:

a、上传时对表单的要求:

-  文件上传要求客户端表单提交特殊的请求--multipart请求,即包含多部分数据的请求。所以文件上传表单对于表单数据的编码类型要求,必须为multipart/form-data。即要为

标签指定enctype属性值为“multipart/form-data”。(enctype,即encodingtype,编码类型。)

-  由于客户端上传文件的大小是不确定的,所以HTTP协议规定,文件上传的数据要存放于请求正文中,而不能够出现在url的地址栏中,因为地址栏中可以存放的数据量太小。也就是说,文件上传的表单,必须提交POST请求,而不能够提交GET请求。

enctype="multipart/form-data">

image:

b、使用第三方工具实现文件上传:

-  需要使用到两个jar包:commons-fileupload-1.3.3.jar和commons-io-2.6.jar,jar包可以在apache官网中下载(commons-fileupload-1.3.3.jar依赖于commons-io-2.6.jar,如果只使用fileupload jar包,会运行程序时会抛出异常)

-  示例代码如下:

-  在index.jsp文件中填写的代码如下所示:

pageEncoding="UTF-8"%>

html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Insert title here

enctype="multipart/form-data">

name:

image:

- 为web应用添加一个Servlet,在web.xml文件中添加配置信息:<?xml  version="1.0" encoding="UTF-8"?>

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

el

fileUploadServlet

com.geeklicreed.servlet.FileUploadServlet

fileUploadServlet

/fileUpload

-  自定义serlvet类,在doPost方法中编写简单实现文件上传的代码:package com.geeklicreed.servlet;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

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.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//判断请求是否为multipart请求

if(!ServletFileUpload.isMultipartContent(request)){

throw new RuntimeException("当前请求不支持文件上传");

}

try {

//创建一个FileItem工厂

DiskFileItemFactory factory = new DiskFileItemFactory();

//创建文件上传核心组件

ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

//解析请求,获取到所有的item

List items = servletFileUpload.parseRequest(request);

//遍历items

for(FileItem item : items){

if(item.isFormField()){  //若item为普通表单项

String fieldName = item.getFieldName();  //获取表单项名称

String fieldValue = item.getString();  //获取表单项的值

System.out.println(fieldName + " = " + fieldValue);

}else{  //若item为文件表单项

//获取上传文件原始名称

String fileName = item.getName();

//获取输入流,其中有上传 文件的内容

InputStream is = item.getInputStream();

//获取文件保存在服务器的路径

String path = this.getServletContext().getRealPath("/images");

//创建目标文件,将用来保存上传文件

File file = new File(path, fileName);

//将输入流中的数据写入到输出流中

OutputStream os = new FileOutputStream(file);

//将输入流中的数据写入输出流中

int len = -1;

byte[] buf = new byte[1024];

while((len = is.read(buf)) != -1){

os.write(buf, 0, len);

}

os.close();

is.close();

}

}

} catch (FileUploadException e) {

e.printStackTrace();

}

}

}

-  启动web应用,访问index.jsp,添加图片后,点击“上传”,可以发现控制台打印结果,在工作空间web项目的指定目录可以看到图片已经上传:(在Eclipse中,默认会把Web项目放到Eclipse的工作空间下的.metadata\.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)

-  FileUploadServlet类中的代码相关解释:(也包含使用fileupload jar包文件上传时的常用方法)

-  org.apache.commons.fileupload.disk.DiskFileItemFactory类:默认的FileItemFactory实现类。这个实现创建FileItem实例(文件条目)。如果是小条目,会将其存入内存中,如果是大条目,会将其存入硬盘中的临时文件。大小条目数据的临界值,是可配置的。The default FileItemFactory

implementation. This implementation creates FileItem instances which keep their

content either in memory, for smaller items, or in a temporary file on disk,

for larger items. The size threshold, above which content will be stored on

disk, is configurable, as is the directory in which temporary files will be

created.

-  setRepository(File repository)方法:设置临时存储文件(这个文件大小大于指定配置临界值)存放的目录位置。

-  setSizeThreshold(int sizeThreshold)方法:设置临界值(单位为字节),当超过这个值时文件将会直接写入硬盘中。(如sizeThreshold为1024 * 1024,则为1兆)voidSets the directory used to temporarily store files that are larger

than the configured size threshold.voidSets the size threshold beyond which files are written directly to disk.

-  org.apache.commons.fileupload.servlet.ServletFileUpload类:处理文件上传的高级API。(如何存储各个部分的数据是由创建它们的工厂决定;给定的部分可能在内存中、磁盘上或者其他地方)High level API for processing file uploads.

This class handles multiple files per single HTML widget, sent using multipart/mixed encoding type, as specified by RFC 1867.  Use parseRequest(HttpServletRequest) to acquire a list of FileItems associated with a given HTML

widget.

How the data for individual parts is stored is determined by the factory

used to create them; a given part may be in memory, on disk, or somewhere

else.

-  parseRequest方法:解析请求,获取FileItem类型元素的List对象:Processes an RFC 1867

compliant multipart/form-data stream.

-  ServletFileUpload类的父类org.apache.commons.fileupload.FileUploadBase的方法:

-  设置每个item的头部字符编码,其可以解决文件名的中文乱码问题:(若tomcat版本较低时,可能会出现文件名中文乱码)voidSpecifies the character encoding to be used when reading the headers of

individual part.

-  setFileSizeMax(long fileSizeMax)方法设置单个上传文件允许上传的最大边界值。

-  setSizeMax(long sizeMax)方法设置一次上传所有文件的总和最大边界值。(单位都为字节)voidSets the maximum allowed size of a single uploaded file,

as opposed to getSizeMax().

voidSets the maximum allowed size of a complete request, as opposed

to setFileSizeMax(long).

-  isMultipartContent(HttpServletRequest req)方法:判断该请求是否包含multipart内容static booleanDeprecated.

1.1 Use the method on ServletFileUpload instead.

-  org.apache.commons.fileupload.FileItem接口:表示在multipart/form-data的POST请求中内的一个文件或者表单条目。This class represents a file or form item that was received within a multipart/form-data POST request.

-  isFormField方法:判断FileItem实例是否为一个普通form项:booleanDetermines whether or not a FileItem instance represents

a simple form field.

-  getFieldName方法:获取对应文件条目(即单个表单项)的name属性值:Returns the name of the field in the multipart form corresponding to

this file item.

-  getName方法:获取客户端文件系统中的原上传文件名:(包含后缀名)Returns the original filename in the client's filesystem, as provided by

the browser (or other client software).

-  getInputStream方法:获取输入流,用于取出上传文件中的内容:Returns an InputStream that can be

used to retrieve the contents of the file.

-  delete方法:删除任何相关联的临时磁盘文件:voidDeletes the underlying storage for a file item, including deleting any

associated temporary disk file.

3、文件下载的实现:

a、超链接下载:将下载资源作为超链接的链接目标文件出现。若浏览器可以解析该资源文件,则将在浏览器上直接显示文件内容;若浏览器不支持该文件的解析,则会弹出另存为对话框,要求用户保存。

-  该下载方式的缺点很明显,不同的浏览器,以及相同的浏览器所安装的插件不同,那么其对于资源的解析能力也就不同,其是否弹出另存为对话框的情况也就不一样。决定权由浏览器掌握。

-  如在jsp文件中添加如下代码,在ff浏览器中点击,直接在浏览器中打开该图片:timg.jpg

b、Servlet方式的文件下载:

-  示例代码:

-  jsp文件中的内容和web.xml文件中添加的配置:download image<?xml  version="1.0" encoding="UTF-8"?>

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

downloadServlet

com.geeklicreed.servlet.DownloadServlet

downloadServlet

/download

-  自定义Servlet类中添加如下代码:package com.geeklicreed.servlet;

import java.io.IOException;

import java.io.InputStream;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String fileName = "火拳艾斯.jpg";

byte[] bytes = fileName.getBytes("utf-8");

fileName = new String(bytes, "ISO8859-1");

//修改响应的头部属性content-disposition值为attachment

response.setHeader("content-disposition", "attachment;filename=" + fileName );

//获取连接服务器端资源文件的输入流

InputStream is = this.getServletContext().getResourceAsStream("/images/timg.jpg");

//获取输出流

ServletOutputStream os = response.getOutputStream();

//将输入流中的数据写入到输出流中

int len = -1;

byte[] buf = new byte[1024];

while((len = is.read(buf)) != -1){

os.write(buf, 0 , len);

}

os.close();

}

}

-  如果想要浏览器下载的方式是以附件的形式下载,需要修改响应的头部属性content-disposition值为attachment;filename=文件名 + 后缀名。(filename表示以附件形式下载显示的文件名)

- javax.servlet.ServletContext接口的getResourceAsStream方法:获取web应用中的指定路径下的资源,以字节输入流InputStream的形式返回。-  java.io.InputStream getResourceAsStream(java.lang.String path) : Returns the resource located at the named path as an InputStream object.

c、启动web应用,点击超链接后,可以看到文件以附件的形式下载:

4、附加说明:

-  上传文件目录的管理:当用户上传的文件过多,而单个目录能够存放的文件个数有限,(windows系统下单文件夹中最大可有65,534个文件)所以需要上传的文件有时需要分目录进行管理。

-   可以使用java.io.File类的mkdir()方法来在当前目录中创建直接子目录,或者使用mkdirs()方法创建当前目录的多层子目录:booleanCreates the directory named by this abstract

pathname.

booleanCreates the directory named by this abstract pathname,

including any necessary but nonexistent

java上传与下载文件_JavaWeb之实现文件上传与下载相关推荐

  1. java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载

    1.  前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2.  具体内容 2.1Struts2文件上传 2.1.1单文件上传 ...

  2. ie11 java 下载文件_Javaweb实现上传下载文件的多种方法

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

  3. java web pdf 下载文件_javaWeb实现文件上传和下载.pdf

    jjaavvaaWWeebb实实现现文文件件上上传传与与下下载载 文件上传概述 实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet 中读取上传文件的数 ...

  4. java web pdf迅雷下载文件_javaWeb实现文件上传及下载.pdf

    jjaavvaaWWeebb实实现现文文件件上上传传与与下下载载 文件上传概述 实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet 中读取上传文件的数 ...

  5. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...

    1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...

  6. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  7. java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  8. java 上传文件及预览_SpringBoot上传下载文件及在线预览

    SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...

  9. java mime上传_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

最新文章

  1. 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环...
  2. ubuntu修改gcc版本
  3. Kettle使用_9 存储过程与设置变量
  4. css为网页顶部和底部都加入背景图
  5. java基础---IO字符流
  6. Gradle善良:获得更多的依赖性见解
  7. 发现1个宝藏项目,GitHub上都没有的那种!
  8. c语言第八章实验题答案,第八章实验报告
  9. 语音识别介绍(上篇)
  10. Linux自学、大数据学习前奏笔记---Linux基础知识,shell命令介绍学习
  11. 2020.8.28丨转录组、全转录组方案设计和案例解析
  12. python的hello world
  13. 国家代码查询(Country codes)
  14. 安装docker-ce
  15. 3行代码Python解决图片清晰度识别,原来我们看到的不一定是这样
  16. 洛谷1456 Monkey King
  17. js一天、两天倒计时定时器实现方案
  18. ESXi通过命令行创建并直通RDM磁盘
  19. iPhone 开发中心 论坛 与 视频
  20. foxmail pop3服务器能收邮件,发不了邮件,为什么我现在用foxmail只能收126的邮件,但是发送说无法连接到服务器POP3 SMTP设置是正确...

热门文章

  1. 前端利器CodePen,了解一下吧
  2. 科学计算机和普通计算器,[财经]普通计算器和科学计算器的区别是什么?手机计算器阵亡是怎么回事? - 南方财富网...
  3. CSR8675学习笔记:新建一个GATT server
  4. NodeJS使用crypto进行MD5加密
  5. 网站怎么增加关键词词库-seo优化关键词排名
  6. 中学计算机教师招聘面试问题,(招聘面试)浙江省教师招聘考试中学信息技术考(16页)-原创力文档...
  7. CCF201812-1 小明上学 (python语言)
  8. 「建议收藏」第一人称视角带你走进 Vue 源码世界
  9. 在CSS中创建径向菜单
  10. 【Clng与Cint】clng与cint的区别及防溢出函数