java上传下载_Java文件上传与文件下载实现方法详解
本文实例讲述了Java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:
Java文件上传
数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。
1、上传表单要求
文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将
标签的enctype属性值设为“multipart/form-data”,enctype表示encodingType,及编码类型
由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在URL地址栏内。也就是说,想要上传文件必须提交POST请求。
表单中要有标签
注意:multipart/form-data请求与普通请求不同
2、下载文件上传jar包并查看官方文档
打开Apache官网http://www.apache.org/,选择APACHE PROJECT LIST中的Commons
选择Commons中的FileUpload项目,并下载jar包和源文件
查看FileUpload的工作方式
查看FileUpload项目的API
3、使用第三方jar包上传文件
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public RegisterServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//第一步、判断请求是否为multipart请求
if(!ServletFileUpload.isMultipartContent(request)) {
throw new RuntimeException("当前请求只支持文件上传");
}
try {
//第二步、创建FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置临时文件存储目录
String path = this.getServletContext().getRealPath("/Temp");
File temp = new File(path);
factory.setRepository(temp);
//单位:字节。本例设置边界值为2MB,超过该值会创建临时文件
factory.setSizeThreshold(1024*1024*2);
//第三步、创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(factory);
//设置item的头部字符编码,解决中文乱码问题
upload.setHeaderEncoding("utf-8");
//设置单个上传文件的最大值为5MB
upload.setFileSizeMax(1024*1024*5);
//设置一次上传所有文件总和的最大值为10MB(上传多个文件时起作用)
upload.setFileSizeMax(1024*1024*10);
//第四步、解析请求获取所有的item
List items = upload.parseRequest(request);
//第五步、遍历item
for(FileItem item:items) {
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
private void processFormField(FileItem item) {
try {
String name = item.getFieldName();
//解决中文乱码问题
String value = item.getString("utf-8");
System.out.println(name+"="+value);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
private void processUploadedFile(FileItem item) {
try {
InputStream inputStream = item.getInputStream();
String fieldName = item.getFieldName();
//获取上传文件原始名称
String fileName = item.getName();
//解决文件同名问题
fileName = System.currentTimeMillis()+fileName;
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
String path = this.getServletContext().getRealPath("/UploadContent");
//Date now = new Date();
Calendar now = Calendar.getInstance();
//对上传的文件进行分类管理
path += "/"+now.get(Calendar.YEAR)+"/"+(now.get(Calendar.MONTH)+1)+"/"+now.get(Calendar.DAY_OF_MONTH);
//若目录不存在,则创建该目录
File directory = new File(path);
if(!directory.exists()) {
directory.mkdirs();
}
File descFile = new File(path,fileName);
OutputStream outputStream = new FileOutputStream(descFile);
int length = -1;
byte[] buffer = new byte[1024];
while((length=inputStream.read(buffer))!=-1) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
//删除临时文件
item.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java文件下载
数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。
1、超链接下载
浏览器能解析的文件会直接显示,如:pdf、jpg......
浏览器解析不了的文件会被另存为,如:rar、exe......
浏览器版本不一样,对文件的解析能力也不同
缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关
2、Servlet方式下载
设置响应头部属性content-disposition值为attachment
获取连接服务器源文件的输入流
获取输出流
将输入流中的数据写到输出流中
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的头部属性content-disposition值为attachment
//使用filename来指定文件名
String filename = "超跑.png";
byte[] bytes = filename.getBytes("utf-8");
//http协议规定浏览器只能接受ISO8859-1类型的字节数据
filename = new String(bytes,"ISO8859-1");
response.setHeader("content-disposition", "attachment;filename="+filename);
//获取连接服务器资源文件的输入流
InputStream is = request.getServletContext().getResourceAsStream("/Resources/BS架构原理图1.png");
//获取输出流
ServletOutputStream os = response.getOutputStream();
//将输入流中的数据写到输出流中
int length = -1;
byte[] buffer = new byte[1024];
while((length=is.read(buffer))!=-1) {
os.write(buffer,0,length);
}
os.close();
is.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
希望本文所述对大家java程序设计有所帮助。
java上传下载_Java文件上传与文件下载实现方法详解相关推荐
- java判断是否闰年_java中判断是否是闰年的方法详解
给定一个年份,判断是否是闰年.条件为:(推荐:java视频教程) A:能被4整除,并且不能被100整除.或者 B:能被400整除. 分析: 首先题目中的A与B为两个判断闰年为真的选项,且属于" ...
- springboot文件上传下载实战 ——文件上传、下载、在线打开、删除
springboot文件上传下载实战 文件上传 文件上传核心 UserFileController 文件上传测试 文件下载与在线打开 文件下载.在线打开核心 UserFileController 文件 ...
- 文件上传下载之文件上传
13.1 文件上传 13.1.1 概述 在开发基于Web的应用的时候,经常会碰到需要实现文件上传.下载的功能,比如编辑某个商品,需要给它上传一个图片等等. 不使用Struts2的话,可以有很多种方 ...
- java word 超链接到文档内部_Java 添加超链接到 Word 文档方法详解
在Word文档中,超链接是指在特定文本或者图片中插入的能跳转到其他位置或网页的链接,它也是我们在编辑制作Word文档时广泛使用到的功能之一.今天这篇文章就将为大家演示如何使用Free Spire.Do ...
- java构建json_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解
摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...
- java 连接 sftp失败_java – 文件上传到SFTP失败(Apache VFS)
我有一个SFTP问题( Windows WinSSHD).我尝试用 Apache Commons VFS在一个文件夹中写一个文件.在本地SFTP上我没有上传的问题,但在第二个SFTP上我总是得到以下错 ...
- 文件上传下载-修改文件上传大小
#上传时出现如下异常: 上传文件的大小超出默认配置 默认10M nested exception is java.lang.IllegalStateException: org.apache.tomc ...
- java i o中文版_Java文件I/O的三种方法
摘要:之前在面试中被问到过两次Java中文件读入输出怎么写,当时只记得一个大概,没有办法很清晰的说出一个条理,今天特地看出总结了一下这方面的内容,想要写出来给大家分享.首先文件读入输出流常用有三种:F ...
最新文章
- ffmpeg 压缩视频
- 中科院调查组成立!杨辉发表声明,并对举报信作出详细回应
- HLG2081分苹果
- Vue注意事项及用得较多的属性归纳
- 计算机网络安全基础知识笔记
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第22篇]如何用蒙哥马利算法表示一个数字和多个相乘的数字
- 【MySQL】基于MySQL的SQL核心语法实战演练(二)
- Laravel核心解读--Database(二) 查询构建器
- mysql增删改查_MySQL的基本使用——简单的增删改查
- 【Linux文件系统监控的Java类库 inotify-java】
- 正经人一辈子都用不到的 JavaScript 方法总结 (二)
- Django django.db.utils.ProgrammingError: (1146, Table 'django.member' doesn't exist)
- 支付宝小程序前端开发简介
- android app 检测是否开启了开发者模式
- 一:细说python3中sort和sorted
- 如何用Python实现股票量化交易?
- 用Python看穿马赛克!
- Charles抓取手机APP接口数据使用方法
- 数独的Java版解法
- python 写入excel数据xlwt_用python包xlwt将数据写入Excel中
热门文章
- php构建soap_使用PHP构建Web服务
- 2008游戏服务器系统下,梦幻西游永恒的传奇 2008服务器一览 17173.com网络游戏:《梦幻西游》专区...
- 机器人控制的基本方法
- matlab——1、二维曲线绘图
- 11gR2数据库发现aler log中有报错:ORA-27090 async io
- 广度优先搜索(Breadth First Search)
- 【博主推荐】html好看的拼图小游戏(附源码)
- 技术人如何通过了解业务,获取晋升机会?
- [导入][转]sap学习手册一
- CSS3的transform+JQuery弄一个翻翻乐小游戏