Java文件上传与文件下载实现方法详解

网友投稿 783 2023-01-13


Java文件上传与文件下载实现方法详解

本文实例讲述了java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:

Java文件上传

数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。

1、上传表单要求

文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将

由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在URL地址栏内。也就是说,想要上传文件必须提交POST请求。

表单中要有标签

注意:multipart/form-data请求与普通请求不同

2、下载文件上传jar包并查看官方文档

打开Apache官网http://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();

//删除临时文件

iJJyYuketem.delete();

} catch (IOException e) {

e.printStackTrace();

}

}

}

Java文件下载

数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。

1、超链接下载

浏览器能解析的文件会直接显示,如:pdf、jphttp://g......

浏览器解析不了的文件会被另存为,如:rar、exe......

浏览器版本不一样,对JJyYuke文件的解析能力也不同

缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关

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.rehttp://ad(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操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java实现客房管理系统
下一篇:Java日志组件间关系详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~