Java实战之04JavaWeb-08文件上传与下载
一、文件上传
1.文件上传的实质是什么
文件的拷贝,文件从客户端拷贝服务器端
2.文件上传的工作
(1)客户端怎样将本地文件输出去?
1)文件上传的表单项 <input type=”file”>表单项必须有name属性值
2)文件上传必须是post提交方式
3)表单项中添加一个属性 enctype=“multipart/form-data”
(2)服务器怎样接受上传的文件,并将文件保存到服务器上?
注意:如果表单的enctype是multipart/form-data,那么通过request.getParameter等类似的方法都失效。虽然方法失效,但是request对象中仍然封装请求的数据。
获取多部分表单数据原理:
使用工具完成上文件文件表单项数据接收
Apache-Commons-fileupload工具可以很方便完成上传文件的接受工作
使用file-upload工具需要到两个jar
fileupload中常用API
磁盘文件项工厂:DiskFileItemFactory:设置文件上传一些参数
文件上传的核心类:ServletFileUpload:文件上传的核心类
文件项对象:FileItem:代表上传文件的表单中的每一部分
API进行详解
try {
//1、创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2、创建文件上传的核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//3、解析request获得表单项FileItem
List<FileItem> parseRequest = upload.parseRequest(request);
//4、判断是普通表单项还是文件上传项
for(FileItem item:parseRequest){
//判读普通表单项还是文件上传项
boolean formField = item.isFormField();//判断是否是普通表单 true是普通表单
if(formField){
//普通表单
//获得表单项的name属性值
String fieldName = item.getFieldName();
//获得表单项的value值
String value = item.getString("UTF-8"); System.out.println(fieldName+"----"+value);
}else{
//文件上传项
//获得上传文件的名称
String fileName = item.getName();
//获得上传文件的内容
InputStream in = item.getInputStream();
//写到服务器端的磁盘上
//C:\\Users\\haohao\\Desktop\\apache-tomcat-7.0.53\\webapps\\day20_208\\upload
String path = this.getServletContext().getRealPath("/upload");
//C:\\Users\\haohao\\Desktop\\apache-tomcat-7.0.53\\webapps\\day20_208\\upload\\itcast.txt
OutputStream out = new FileOutputStream(path+"/"+fileName);
//文件拷贝的模板代码
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
(3)文件上传的细节
1)文件在上传时 会根据浏览器不同导致上传的文件的名称是不同
服务器端在item.getName() 获得上传文件的名称时会如下两种情况
有磁盘符 C:\abc\xxx.txt
没有磁盘符 xxx.txt
2)解决上传文件的重名的问题
解决方案:将上传文件的名称替换成随机uuid
例如:美女.jpg-----uuid.jpg
3)上传文件过多的问题
目录怎样去划分?
时间划分目录
区域划分目录
类型划分目录
按照算法进行目录划分
根据文件的hashcode
二、文件下载
1.文件下载实质
文件的拷贝,从服务器的磁盘上将文件拷贝本地客户端
2.文件下载的工作
(1)服务器端怎样将文件发送出去?
response.getOutputStream().write();
(2)客户端怎样接受服务器端传输的文件?
下载文件的过程是浏览器内核控制,不需要编码
3.问题:
文件什么情况下可以下载?
浏览器不识别文件都下载,识别的文件进行解析
什么情况下需要编写文件下载的代码?
浏览器可以识别的文件编写文件下载的代码
4.怎样在服务器端编写文件下载代码
步骤:
1)读取服务器磁盘上的文件
2)创建输出流写给客户端 response.getOutputStream()
3)告知客户端这个文件不需要解析 需要下载
Content-Type:文件类型MIME类型
获得MIME类型:getServletContext().getMimtType(文件名);
Content-Disposition:attachment;filename=文件名称
5.关于下载中文文件
发现中文文件在下载时不能正常显示文件名称
问题出现在 attachment;filename=中文文件名称
怎样对要下载的中文名称进行编码?
if(火狐){
对下载中文文件名使用base64编码
}else if(ie){
对下载中文文件名使用UTF-8编码
}
//获取filename
String filename = request.getParameter("filename");//????
//解决get提交的中文乱码问题
filename = new String(filename.getBytes("iso8859-1"),"UTF-8");//美女.jpg String downloadFilename = filename;
String agent = request.getHeader("User-Agent");
if (agent.contains("MSIE")) {
// IE浏览器
downloadFilename = URLEncoder.encode(filename, "utf-8");
downloadFilename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
downloadFilename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
downloadFilename = URLEncoder.encode(filename, "utf-8"); } //response.setHeader("Content-Disposition","attachment;filename=" + new String(filename.getBytes("gbk"), "ISO8859-1")); //设置两个头通知客户端要进行文件的下载
response.setContentType(this.getServletContext().getMimeType(filename));
response.setHeader("Content-Disposition", "attachment;filename="+downloadFilename);//问题:给客户端的filename乱码 //编写文件下载的代码
String path = this.getServletContext().getRealPath("/download/"+filename);
InputStream in = new FileInputStream(path);
OutputStream out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
}
不同浏览器默认对下载文件名称解码方式不同,导致客户端在编码时要进行判断
火狐是什么解码方式:base64
ie是什么解码方式:UTF-8
Java实战之04JavaWeb-08文件上传与下载的更多相关文章
- java框架篇---struts之文件上传和下载
Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...
- java实现大文件上传和下载
[文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后 ...
- Java 客户端操作 FastDFS 实现文件上传下载替换删除
FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- Java实现FTP文件上传与下载
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cl ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息
1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...
- 【Java】JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- Java精选笔记_文件上传与下载
文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...
随机推荐
- 山东理工大学ACM平台题答案关于C语言 1543 Egypt
Egypt Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 A long time ago, the Egyptians fi ...
- Sql sp_executesql 参数问题
DECLARE @name NVARCHAR(30), @sql NVARCHAR(300)set @sql= N'SELECT TOP 1 @n=EmpName from dbo.Emp' exec ...
- 剑指OFFER之丑数(九度OJ1214)
题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...
- MySQL订单分库分表多维度查询
转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...
- smarty3--registerPlugin()函数报错问题
smarty版本:smarty3.1.30 registerPlugin错误信息: Notice: Trying to get property of non-object in E:\Joomla\ ...
- Uploadify 3.2 参数属性、事件、方法函数详解
一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...
- PAT 1009
1009. Product of Polynomials (25) This time, you are supposed to find A*B where A and B are two poly ...
- mysql distinct跟group by性能
mysql distinct和group by性能 1,测试前的准备 //准备一张测试表 mysql> CREATE TABLE `test_test` ( -> `id` int ...
- Support Facades
Support Facades Introduction Facades provide a "static" interface to classes that are avai ...
- ADT在线安装
以往安装ADT根本就不是个问题,可是现在就是个大问题了,联通的宽带网络连www.google.com.hk都打不开,你叫我们这些P民怎么活? https://dl-ssl.google.com/and ...