一、文件上传

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文件上传与下载的更多相关文章

  1. java框架篇---struts之文件上传和下载

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  2. java实现大文件上传和下载

    [文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后 ...

  3. Java 客户端操作 FastDFS 实现文件上传下载替换删除

    FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...

  4. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. java文件上传和下载

    简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  6. Java实现FTP文件上传与下载

    实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cl ...

  7. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

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

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

  9. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  10. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

随机推荐

  1. Appium Android定位元素与操作

    文章写得很好,转载备用 一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录 ...

  2. C++学习笔记(六):复杂数据类型(string、容器和STL)

    STL 即Standard Template Library(标准模板库),由于C++自带的数据类型过于简单,并不能满足我们的使用需要,而STL作为C++标准的内置库为我们编写好了多种高效的数据结构和 ...

  3. C++学习笔记(四):枚举

    枚举用来代替静态常量,优点就是可以确定值的范围,而常量则无法确定范围: 常量表示法: ; ; ; ; ; bool func(int type) { //范围检查 || type > ) thr ...

  4. 二、JSP的3个编译指令,7个动作指令,9个内置对象

    JSP 3个编译指令 1)  page指令(基本不需要用到,使用默认即可) 主要属性: 1.Language:指定脚本所采用的语言类型,现在只支持java 2.Extends:定义当前jsp产生的se ...

  5. Struts2中的session、request、respsonse获取方法

    个人对于struts有一种复杂的心情,平心而论,struts2是个人最早接触到的的框架,在学校的时候就已经开始学习了,大四毕业设计,无疑用的还是struct,那时候SSH还是很流行的,后来出来实习,直 ...

  6. Andorid4.x 流氓式屏蔽HOME键

    转载请列明出处 http://blog.csdn.net/steelychen/article/details/37757341 应用项目须要要屏蔽HOME键. 项目本身的要求是让按下HOME键后程序 ...

  7. 该优化针对Linux X86_X64环境

    http://netkiller.github.io/www/tomcat/server.html 1. Tomcat优化其实就是对server.xml优化(开户线程池,调整http connecto ...

  8. 多系统通讯-DotNetMQ

    很久都没有写博客了,从15年4月份一直忙到现在,我才有时间去做梳理和总结,因为我提离职了,感觉整个世界突然变得不一样,随着而来的就是心情的放松,写一篇文章也是对过去一年多工作的梳理,加深印象 积累和沉 ...

  9. Xcode文件目录选中变成白色, 解决方案

    新版Xcode很不稳定, 有时候被选中文件变成白色, 看着很不舒服, 以前都是毫无办法, 等它自动变回来, 现在有一个解决办法, 点击文件目录上面的选项, 随便切换一个再切换回来, 发现文件目录颜色回 ...

  10. 基于动态库的C++插件开发模型

    基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供2个统一的方法:1) baseClass * create(); 2) void destroy( baseClass* );,调 ...