Java文件上传与文件下载实现方法详解
作者:changuncle 发布时间:2023-11-20 12:28:45
本文实例讲述了Java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:
Java文件上传
数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。
1、上传表单要求
文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将<form/>标签的enctype属性值设为“
multipart/form-data
”,enctype表示encodingType,及编码类型由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在URL地址栏内。也就是说,想要上传文件必须提交POST请求。
表单中要有
<input type="file" />
标签注意:
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<FileItem> 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程序设计有所帮助。
来源:https://blog.csdn.net/xiaouncle/article/details/80379322


猜你喜欢
- 本文介绍Android中Intent的各种常见作用。1 Intent.ACTION_MAINString: android.intent.a
- 在实现蓝牙接收时,网上的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来。蓝牙开发需要用到一个第三方的库InTheHand
- 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时
- 本文实例为大家分享了Android实现可复用的筛选页面的具体代码,供大家参考,具体内容如下窗口代码/** * 筛选页面 * 1.将用户的输入
- 我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力。确实,比起一张单调的图片,
- 自定义类:using System;using System.Collections.Generic;using System.Linq;u
- 前言Java.util包中的List接口继承了Collection接口,用来存放对象集合,所以对这些对象进行排序的时候,要么让对象类自己实现
- 什么是依赖注入首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部
- RestTemplate 请求接收自定义400+ 或500+错误场景当服务端自定义400错误返回体时,使用restTemplate 请求接收
- 个人感觉mob平台功能还是比较强大的,很多功能都可以通过他们平台来实现。建议仔细观看每一个步骤,如果一个步骤没处理好,可能就会让你的这个功能
- sftp简介sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的
- 一:背景1. 讲故事高级语言玩多了,可能很多人对指针或者汇编都淡忘了,本篇就和大家聊一聊指针,虽然C#中是不提倡使用的,但你能说指针在C#中
- 一、使用在非静态方法上public synchronized void syzDemo(){ System.out.print
- 这几年都在搞前后端分离、RESTful风格,我们项目中也在这样用。前几天有人遇到了解析JSON格式的请求数据的问题,然后说了一下解析的方式,
- java 中编写 GUI 有两中工具包,分别为 AWT、Swing。Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和
- 这是主要使用到的jar 文件是:spring mvc +apache common-fileuplad第一步:web.xml 文件。【重点是
- 前言Spring 5发布有两年了,随Spring 5一起发布了一个和Spring WebMvc同级的Spring WebFlux。这是一个支
- 本文实例为大家分享了android实现文件读写的具体代码,供大家参考,具体内容如下读取/*** 文件读取* @param is 文件的输入流
- Android使用GridView实现日历功能示例,代码有点多,发个图先:如果懒得往下看的,可以直接下载源码吧,最近一直有人要,由于时间太久
- 摘要:vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目