一、文件上传

  • 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理。

  1.1  编写html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="servlet/upload" method="post" enctype= "multipart/form-data">   
文件描述:<input type="text" name="desc" /><br/>
<input type="file" name="file" /><br/>
<input type="submit" value="上传" />
</form>
</body>
</html>

解析:enctype= "multipart/form-data" 是实现文件上传必不可缺少的属性,但是加了此属性之后,就不能以 request.getParameter(arg0); 来获取表单值,只能通过getFieldName()获取表单名,getString()获取表单值。

  1.2  编写servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
fileUpload(request); }
  /*
  *文件上传
  */ public void fileUpload(HttpServletRequest request) {
                    //磁盘文件工厂类DiskFileItemFactory主要是设置临时文件目录
DiskFileItemFactory diff=new DiskFileItemFactory();
diff.setSizeThreshold(10*1024*1024);        //设置上传文件大小的临界值,大于这个值就先存在临时目录,然后在上传到服务器。小于这个值直接上传到服务器。10M
diff.setRepository(new File(this.getServletContext().getRealPath("tmp"))); //设置临时文件目录                         //临时文件设置好之后,就可以处理上传的文件了。
ServletFileUpload upload=new ServletFileUpload(diff); //文件上传对象upload按照文件工厂diff的配置 /*接下来可以对request进行解析了,
*request的数据分为普通表单数据和文件,需要区别对待处理。
* 对request解析出来的是List<FileItem>类型的,一个表单值就是一个对象。
*/
List<FileItem> items=null;
try {
items=upload.parseRequest(request); //对request进行解析,解析出来的是List<FileItem>类型的 for(FileItem item:items){ //对表单里所有数据进行循环,然后对表单数据和文件数据区分处理
if(item.isFormField()){ //如果为表单数据
if("desc".equals(item.getFieldName())) {             //如果表单元素的元素名是desc,
System.out.println("文件的描述为:"+item.getString("UTF-8"));    //item.getString("UTF-8")解决乱码问题
} }else{ //否则为文件数据
String path=this.getServletContext().getRealPath("upload");       //获取存放上传文件的文件夹真实路径(即在硬盘上的路径,而不是在项目中的相对路径)
OutputStream os=new FileOutputStream(new File(path+"/"+item.getName())); //用户上传文件的路径为path文件夹里,名字是item.getName()即上传时候的文件名 if(item.isInMemory()){     // 如果文件是直接存放在内存的,即小于临时文件的临界值,小于10M,可以直接将用户上传的文件直接拷贝到upload文件里。
os.write(item.get()); //item.get()得到用户上传的文件的数据流 }else{           //如果上传文件大小大于临界值,这个文件会现在临时文件夹tmp里,然后再上传到upload文件夹里。
IOUtils.copy(item.getInputStream(), os); //直接将用户文件的数据流拷贝到输出流即可
}
os.close();
}
} } catch (Exception e) { e.printStackTrace();
}
}
  • 真实路径:

右击项目名,选择“properties”, 如图

打开图中的path:“C:\Users\Administrator\workspace”  ,选择第一个文件夹

找到这个文件夹

找到项目名,点击进去:

即可找到upload或者tmp文件夹。





二、文件下载

        

  2.1  编写html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./js/lib/jquery.js">
$(function(){
$('button').click(function(){ $('form').submit();
});
});
</script>
</head>
<body>
<form action="servlet/filedown" >
<button>下载文件</button>
</form>
</body>
</html>

  2.2  编写servlet

FileDown.java(url-patting=servlet/filedown)

package servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; public class FileDown extends HttpServlet {
private static final long serialVersionUID = 1L; public FileDown() {
super();
// TODO Auto-generated constructor stub
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName="中文.zip"; fileName=new String(fileName.getBytes(),"ISO8859-1");      //设置文件名编码 response.setHeader("Content-Disposition","attachment;filename="+fileName); //当Content-Type 的类型为attachment(附件)时 , 这个信息头会告诉浏览器这个文件的名字和类型。 InputStream is=this.getServletContext().getResourceAsStream("upload/mysql驱动.zip");    //把供用户下载的文件转换为输入流  
OutputStream os=response.getOutputStream();               //得到响应给用户的输出流。          IOUtils.copy(is, os);            //把文件的输入流拷贝到响应给用户的输出流,
is.close();
os.close();
}
}

结果:

(八)利用apache组件进行文件上传下载的更多相关文章

  1. 利用apache组件实现文件上传

    实现文件上传需要引入: commons-fileupload-1.3.2.jar commons-io-2.5.jar commons-logging-1.2.jar <!DOCTYPE htm ...

  2. 使用commons-fileupload-1.2.1.jar等组件实现文件上传

    使用的主要jar包:commons-io-1.3.2.jar包;commons-fileupload-1.2.1.jar包:commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前 ...

  3. js文件上传下载组件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  4. jquery组件WebUploader文件上传用法详解

    这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...

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

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

  6. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  7. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  8. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  9. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

随机推荐

  1. SignalR 初体验

    目录 一.前言 二.服务端 2.1.站点服务端 2.2.宿主服务或客户端 2.3.持久连接和集线器 三.客户端 3.1.使用代理客户端 3.2.不使用代理客户端 一.前言 微软官方给的说明:ASP.N ...

  2. SpringBoot项目的异常

    1.问题描述 创建springcloud 项目时候,main报错: Spring Boot Application in default package less… (Ctrl+F1)Inspecti ...

  3. 分享私藏多年的Markdown编辑器

    相信很多人都使用 Markdown 来编写文章,Markdown 语法简洁,使用起来很是方便,而且各大平台几乎都已支持 Markdown 语法 那么,如何选择一款趁手的 Markdown 编辑器,就是 ...

  4. Mac下mysql出现错误:ERROR 1055 (42000)

    问题原因: ONLY_FULL_GROUP_BY的意思是:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句 ...

  5. transitionend事件 监听 fadeIn fadeOut 两个方法无效(动画结束时无法执行transitionend里面的代码)

    //下面的例子证明 fadeIn() fadeOut() 不能使用transitionend事件进行监听. //说白了在fadeIn fadeOut 后面监听动画结束时,transitionend是不 ...

  6. Linux 理解Linux的memory overcommit 与 OOM Killer

    Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存.一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪 ...

  7. js new call apply bind 的 原理

    new new 做了什么事?1. 以 Object.protoype 为原型创建一个新对象 2. 以新对象为 this,执行函数的 [[call]] 3. 如果 [[call]] 的返回值是对象,那么 ...

  8. Manjaro Linux无备份迁移home目录

    前几天安装了最新的manjaro kde 18.10,速度刚开始非常快,后来几乎每次重启都会出现无法挂在home分区的情况,刚开始以为是分区对齐的问题,但是后来发现根本不是.算了,干脆迁移下home分 ...

  9. vue实现element-ui对话框可拖拽功能

    element-ui对话框可拖拽及边界处理 应业务需求,需要实现对话框可拖拽问题,应element-ui没有提供官方支持,于是便参考大神的文章,得出了适合业务需要的解决方案.很多大神给出的代码是没有解 ...

  10. JS中的常用的代码操作

    本文件介绍常用的js代码的DOM操作.CSS操作.对象(Object对象.Array对象.Number对象.String对象.Math对象.JSON对象和Console对象)操作说明. 一.DOM树的 ...