文件上传功能应用非常广泛,例如:头像上传、商品图片、新闻图片、相册、网盘
文件上传
1、客户端,为用户提供文件上传输入框
2、服务器端,编写程序,将上传文件数据,保存到服务器端
* 将客户端一个文件,传递到服务器端
文件上传编程
1、编写上传文件form表单
提供input type="file" ,必须为上传项提供name属性,上传form表单必须post,enctype设置为multipart/form-data
2、服务器端,完全根据request.getInputStream 方法 对请求体内容进行分割,获得文件上传内容 ----- 非常麻烦
使用Apache 公司提供 commons-fileupload 工具包完成文件上传
* commons-fileupload 和 jsp smart upload 框架(在model1 时代主流使用) ----- 在Servlet3.0 之后,Servlet程序本身就支持文件上传
下载 commons-fileupload / commons-io 包 --- 将 jar包复制WEB-INF/lib
fileupload 快速入门
1、使用工厂 DiskFileItemFactory
2、通过工厂构造解析器 ServletFileupLoad
3、解析器将请求体各个部分 以分隔线切割 ---- 多个部分(每个部分就是FileItem)
4. 通过FileItem 的isFormField 判断是否为文件上传
上传文件
getInputStream 获得文件内容
getName 获得文件名
不是上传文件
getFieldName 获得name属性
getString 获得value属性
********** 对于老版本浏览器,会存在客户端路径,使用stringAPI 将路径切割掉
FileUpload 核心类 API详解
1、DiskFileItemFactory
setSizeThreshold(int sizeThreshold) ----- 设置内存缓冲区大小
setRepository(java.io.File repository ----- 设置临时文件存放位置
* 上传文件优先保存内存缓冲区,当内存缓存区不够用,在硬盘上产生临时文件,临时文件保存指定临时文件目录中
* 临时文件与源文件内容相同
* 中文附件名 乱码问题 ------------- upload.setHeaderEncoding("utf-8");
* 当上传文件完成时,删除临时文件 fileItem.delete();
2、ServletFileUpload
setHeaderEncoding(java.lang.String encoding) ----- 设置上传文件附件名编码(解决乱码)
parseRequest(HttpServletRequest request) ----- 解析请求体内容,返回List<FileItem>
isMultipartContent(javax.servlet.http.HttpServletRequest request) ----- 判断form的enctype是否为multipart/form-data (true 是文件上传form)
setFileSizeMax(long fileSizeMax) 设置单文件最大大小 setSizeMax(long sizeMax) 设置请求最大大小
***** setProgressListener(ProgressListener pListener) 为文件上传设置监听器,监听文件上传全过程
* 文件上传进度条
3、FileItem
isFormField() 是否为文件上传域,true不是文件上传,false是文件上传
如果不是文件上传
getFieldName 获得name属性
getString 获得value属性 ------------ 文件上传表单中request.setCharacterEncoding 不能使用,request.getParameter不能使用
* 请求中有中文 getString(java.lang.String encoding)
如果是文件上传
getName 获得文件名
getInputStream 获得文件内容
整理乱码解决:
附件名乱码 servletFileupload.setHeaderEncoding(编码)
普通form项中文乱码 fileItem.getString(编码)
文件上传注意问题
1、乱码问题(附件名乱码 servletFileupload.setHeaderEncoding,普通form项乱码fileItem.getString)
2、临时文件删除,必须先关闭FileItem的输入流,再调用FileItem.delete方法 删除临时文件
3、文件保存目录
* WEB-INF在浏览器端不允许通过URL直接访问
WEB-INF内 :必须通过服务器端程序去访问,Servlet ---- getRealPath(/WEB-INF) ---------------- 需要权限,需要身份认证
WEB-INF外 :浏览器直接通过URL访问 ------------------ 任何人都可以访问
思考:电影会员点播网站,在线看电影,收费。上传电影放到哪里? WEB-INF 里面
QQ头像、京东商城商品图片 。上传后 放到哪里? WEB-INF外面
4、将所有文件放到相同目录中,当文件重名时,会发生覆盖效果 -------- 上传文件名唯一
UUID + filename
5、当系统人气很高,当所有上传文件保存到一个目录时,随着系统使用,目录中文件数量非常巨大
* 目录出现访问非常慢,无法访问情况
* 采用目录分散算法
按时间(一天一目录)、按用户 ----- 最主流
每个目录存放固定数量文件 ----- 每个目录存放1000个文件。超过1000 新建一个目录
hachcode 存放分散目录
ProgressListener 文件上传进程监听器,监听文件上传进度 ------ 在页面上设计上传进度条 (AJAX案例)
传输速率 = 已经上传大小/已经使用时间;
剩余时间 = 剩余大小/速率;
1024 b/ms = (1024/1024)*1000 KB/S
--------------------------------------------------------------------------------------------------------------------------------------------
文件下载
第一种方式,用超链接指向要下载的文件 (DefaultServlet 将资源返回,如果浏览器对资源格式不识别,询问用户是否下载)
* 如果浏览器识别下载文件格式,自动打开,如果浏览器不识别文件格式,弹出下载框
* 因为直接通过url访问资源,资源存放WEB-INF目录之外,没有权限控制,直接下载
第二种方式,编写Servlet,在Servlet中获得要下载文件
* 在下载文件的程序中,必须设置两个响应头字段 Content-Type(MIME类型)、Content-Dispostion (以附件形式下载)
获得文件MIME类型 ----- tomcat/conf/web.xml 定义很多文件的MIME类型 -- ServletContext 提供getMimeType 根据文件扩展名获得文件MIME类型
* response.setContentType(getServletContext().getMimeType(file));
Content-Disposition : attachment;filename=xxx
* response.setHeader("Content-Dispostion", "attachment;filename=" + file);
案例:遍历服务器指定目录下所有文件,并提供下载
* 广度非递归 遍历
* 下载D:\TTPmusic 中所有音乐
getAbsolutePath ----- c:\aa\bb\..\1.txt ==== new File("c:\\aa\\bb","..\\1.txt");
getCanonicalPath ----- c:\aa\1.txt
两个问题:
1、浏览器在GET方式提交中文时,存在编码问题 ------- 解决:手动对提交中文进行编码
* URLEncoder 对get方式提交中文手动编码
2、在文件下载时,附件名存在乱码问题
* IE 对附件名编码 和 FF对附件名编码 不同
* IE 采用URL编码 URLEncoder.encode
* FF 采用BASE64编码 MimeUtility.encodeText
MimeUtility.encodeText 对中文内容进行Base64编码,但是如果编码内容中没有中文,该方法将什么也不做!
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 使用get方式传递中文信息
String path = request.getParameter("path");
// get 乱码解决 --- 手动
path = new String(path.getBytes("ISO-8859-1"), "utf-8");
// 截取文件名
String filename = path.substring(path.lastIndexOf("\\") + 1);
// 设置两个头信息
response.setContentType(getServletContext().getMimeType(filename));
// 乱码问题 --- 不同浏览器解决方式不同
String agent = request.getHeader("User-Agent");
if (agent.contains("MSIE")) {
// IE 浏览器 采用URL编码
filename = URLEncoder.encode(filename, "utf-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ filename);
} else if (agent.contains("Mozilla")) {
// 火狐浏览器 采用Base64编码
// filename = MimeUtility.encodeText(filename);// 全英文不编码
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?UTF-8?B?"
+ new String(base64Encoder.encode(filename
.getBytes("UTF-8"))) + "?=";
response.setHeader("Content-Disposition", "attachment;filename="
+ filename);
} else {
// 默认 不编码
response.setHeader("Content-Disposition", "attachment;filename="
+ filename);
}
InputStream in = new BufferedInputStream(new FileInputStream(path));
OutputStream out = response.getOutputStream();
int temp;
while ((temp = in.read()) != -1) {
out.write(temp);
}
in.close();
out.close();
}
JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.LinkedList"%>
<%@page import="java.io.File"%>
<%@page import="java.net.URLEncoder"%>
<!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>Insert title here</title>
</head>
<body>
<h1>文件下载列表</h1>
<!-- 将D:\TTPmusic 中所有音乐文件,显示列表,允许用户下载 -->
<%
// 遍历指定目录 --- 非递归广度
File root = new File("F:\\12期完整");
LinkedList<File> list = new LinkedList<File>();// 存储
list.add(root);// 集合中存在一个目录
while(!list.isEmpty()){
// 集合不为空
File currentDir = list.removeFirst();// 返回目录对象
File[] files = currentDir.listFiles();// 获得目录下所有文件
for(File f : files){
if(f.isDirectory()){
// 将未遍历目录 加入集合
list.add(f);
}else{
// 是一个文件
// get 、post 提交中文,使用URL编码
// <c:url value="/servlet/DownloadServlet" var="url">
// <c:param name="filename" value="${me.key}"></c:param>
// </c:url>
String args = URLEncoder.encode(f.getCanonicalPath(),"utf-8");// 这个本来是浏览器默认动作,只是手动执行
out.println("<a href='/day20/downloadMusic?path="+args+"'>"+f.getName()+"</a><br/>");
}
}
}
%>
</body>
</html>
---------------------------------------------------------------------------------------------------------------------------------
编写文件上传下载系统(netdisk)
1、上传文件,任何都可以下载 ,练习文件下载程序,WEB-INF 里面
2、上传文件,hashcode目录分散算法
3、保证存放硬盘文件名 唯一 UUID
4、将上传文件基本信息 保存数据库里面
class Resource {
private int id;
private String uuidname; //上传文件的名称,文件的uuid名
private String realname; //上传文件的真实名称
private String savepath; //记住文件的位置
private Timestamp uploadtime; //文件的上传时间
private String description; //文件的描述
}
create table resource(
id int primary key auto_increment,
uuidname varchar(100),
realname varchar(40),
savepath varchar(40),
uploadtime timestamp,
description varchar(255)
);
- 浏览: 73540 次
- 性别:
文章分类
最新评论
- upload_download.zip (1.2 MB)
- 下载次数: 10
发表评论
-
git sshkey生成
2015-10-13 10:09 566Git SSH Key 生成步骤 2012-11 ... -
hibernate04
2014-06-27 21:03 570*一)hibernate的检索方 ... -
hibernate03 一对一 多对多双向映射
2014-06-24 17:19 955*一)【双向】一对多 ... -
hibernate_02 四种状态 多对一级联操作
2014-06-11 19:55 1108*一)持久化对象的状态变化和对应的方法 (1)持久化 ... -
hibernate_01hibernate入门简单api
2014-06-10 18:20 745一)orm和hibernate概述 参见PPT< ... -
struts2_03表单校验ognl国际化
2014-06-07 10:23 987一、用户输入验证 1、编程方式: 动作类中的所有方法进行验 ... -
struts02表单验证文件上传自定义拦截器类型转换常用常量
2014-05-11 21:46 996一.package下可以配置全局页面 <!-- pa ... -
struts201 struts2环境搭建及入门
2014-05-10 21:31 582一、分析之前的项目的不足,编写属于自己的框架二、Strut ... -
ajax03 jquery jquery_ajax
2014-05-09 23:14 716非常流行JS框架 : jQue ... -
day25 注解技术 动态代理 servlet3.0 线程池
2014-05-03 01:11 1323Java基础加强第一天 : JDJava基础加强第一天 : J ... -
day19 javamail
2014-05-02 10:42 1044什么情况需要邮件发 ... -
ajax day01 JS加强
2014-05-02 10:37 714<!--[if !mso]> <styl ... -
ajaxday2 ajax json xstream
2014-05-02 10:34 1006第三部分:AJAX 异步 JavaScript和 XML ... -
day18 监听器 统计在线人数,定时销毁超时session,钝化活化session,在线列表显示和踢人功能防止用户自动登录,在线支付
2014-04-12 20:53 934Servlet 监听器和过滤器一样,是Servlet开发高 ... -
day17过滤器 禁止缓存中文乱码自动登录MD5加密url级别权限控制
2014-04-12 09:27 1218day17Servlet Filter 过滤器 day1 ... -
day16 项目1客户信息系统
2014-04-09 15:32 545客户信息增删改查系统 软件工程开发流程:1、瀑布模型 2 ... -
day15 JDBC元数据 DBUtils 开发模型
2014-04-06 17:47 776人们直接使用JDBC开发,非常麻烦 ----- 企业中开发w ... -
day14 JDBC事务管理 数据库连接池技术
2014-04-06 17:44 1010今天学习重点:JDBC事 ... -
day13 JDBC 基础 事务控制 大数据 批处理
2014-04-06 17:41 883JDBC : Java Database Connectiv ... -
day12 mysql复杂sql语句编写
2014-04-06 17:38 968SQL基本部分:1、数据 ...
相关推荐
day18-文件上传与下载.xmind可能是一个思维导图,详细列出了文件上传下载的步骤和关键点。而"代码"可能包含了实际实现这些功能的示例代码,包括前端的Ajax请求和后端的文件处理逻辑。 总的来说,理解和掌握Web文件...
在IT领域,尤其是在Web开发中,文件的上传与下载是一项基本且重要的功能。根据给定文件的标题、描述以及部分代码内容,我们可以深入探讨在C#中实现文件上传与下载的相关知识点。 ### 文件的上传 文件上传是用户将...
在IT行业中,文件的上传和下载是Web应用中常见的功能,尤其在云存储、文档共享、协同工作等场景中不可或缺。本示例中提到的"上传和下载文件的代码"可能是一个基于fileupload组件实现的解决方案。fileupload组件通常...
在这个"文件上传下载servlet自用"的项目中,我们主要探讨的是如何利用Servlet实现文件的上传与下载功能。 首先,我们来理解一下文件上传。在Web应用中,用户通常需要将本地文件发送到服务器进行存储或处理。Servlet...
在互联网开发中,文件的上传与下载是非常常见的功能需求之一。使用 Socket 进行文件的传输是一种非常基础且高效的方式。本文将详细介绍如何利用 Java 的 Socket 编程实现文件的上传与下载。 #### 二、Socket 基础 ...
在这个"SevenDay-Spring MVC 实现文件上传与下载"项目中,我们将深入探讨如何利用Spring MVC来处理文件的上传和下载。 首先,`pom.xml`是项目的核心配置文件,它定义了项目的依赖管理。在这个项目中,可以看到对`...
大华智慧园区前台任意文件上传(1day)
在`Day15_netdisk`文件夹中,可能包含了实现文件上传和下载的示例代码。通常,会有一个Servlet类处理请求,如`FileUploadServlet`用于处理上传,另一个如`FileDownloadServlet`处理下载。这些类可能包含了处理...
JavaEE Struts 文件上传是Web开发中的一个常见需求,它允许用户从客户端向服务器传输文件。Struts作为JavaEE框架的一部分,提供了强大的功能来处理这种交互。以下是对这个主题的详细解析。 首先,理解文件上传的...
移动开发的小白树懒在一些写的过程几下的简单笔记,为以后的移动开发打下坚实的基石.
根据提供的压缩包子文件"day35文件上传下载",我们可以推测这可能是关于文件上传和下载的一个学习项目或教程的代码,可能包含了前端和后端的实现。具体细节需查看代码才能进一步了解。学习和理解这些知识点,将有助...
《.NET版ueditor图片与文件上传自定义文件夹详解》 ueditor是一款广泛应用的富文本编辑器,它集成了图片、文件上传等功能,极大地丰富了网页内容的编辑体验。在.NET开发环境中,我们常常需要根据项目需求对ueditor...
**(3)文件上传表单与普通文本表单的区别** - 文件上传表单的`enctype="multipart/form-data"`,表示使用多部件格式。 - 普通文本表单的`enctype`默认为`application/x-www-form-urlencoded`(POST方法)或无正文...
4. `day22.doc`:可能是一个详细的教学文档,阐述了上传下载的实现过程和注意事项。 总之,Java通过Servlet API和第三方库提供了强大且灵活的文件上传和下载功能。理解这些概念并熟练运用它们,可以帮助开发者构建...
在ASP.NET中处理文件上传和下载时,需要关注几个关键点:文件大小限制、文件类型的验证以及文件的存储位置。通过合理配置和编写相应的代码逻辑,可以有效地管理文件上传下载的过程,从而提高应用的安全性和用户体验...
【标题】"day20_xm_mall.zip" 指的是一个压缩包文件,其中包含的项目可能是一个关于小米公司的在线商城系统演示版本。这个压缩包可能是为教学、学习或者分享目的而创建的,旨在展示如何构建一个电商网站,特别是以...
当文件存储在云端,如AWS S3或阿里云OSS时,服务提供商通常提供了API接口,允许开发者通过流式操作上传和下载文件。这些接口通常会处理网络连接、重试逻辑以及错误处理。 8. **异步文件传输** 在现代高性能系统中...
计算机前端-核心编程day1-05文件上传原理.avi