Servlet上传文件和下载文件示例
Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例。
用例
我们的用例是提供一个简单HTML页面,客户端可以在其中选择要上传到服务器的本地文件。 在提交上传文件的请求后,我们的Servlet程序会将文件上传到服务器中的目录中,然后提供URL,用户可以通过该URL下载文件。 出于安全原因,不会为用户提供下载文件的直接URL,而是会为他们提供下载文件的链接,并且我们的Servlet将处理请求并将文件发送给用户。
我们将在Eclipse中创建一个动态Web项目,项目结构如下图所示。
让我们研究一下Web应用程序的所有组件并了解其实现。
用于上传文件HTML页面
我们可以通过向Servlet发送发布请求并提交表单来将文件上传到服务器。 我们无法使用GET方法上传文件。 还要注意的一点是,表单的enctype应该是multipart / form-data 。 要从用户文件系统中选择文件,我们需要使用类型为file的 输入元素。 因此,我们可以使用一个简单HTML页面将文件上传为:
index.html
<html>
<head></head>
<body>
<form action="UploadDownloadFileServlet" method="post" enctype="multipart/form-data">
Select File to Upload:<input type="file" name="fileName">
<br>
<input type="submit" value="Upload">
</form>
</body>
</html>
服务器文件位置
我们需要将文件存储到服务器上的某个目录中,可以在程序中对这个目录进行硬编码,但是为了获得更好的灵活性,我们将在部署描述符上下文参数中将其保持可配置状态。 另外,我们会将上传文件的html页面添加到欢迎文件列表中。
我们的web.xml文件如下所示:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><display-name>ServletFileUploadDownloadExample</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><context-param><param-name>tempfile.dir</param-name><param-value>tmpfiles</param-value></context-param>
</web-app>
ServletContextListener实现
由于我们需要读取文件位置的上下文参数并从中创建File对象,因此可以在初始化上下文时编写ServletContextListener来执行此操作。 我们可以将绝对目录位置和File对象设置为上下文属性,以供其他servlet使用。
我们的ServletContextListener实现代码如下。
FileLocationContextListener.java
package com.journaldev.servlet;import java.io.File;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class FileLocationContextListener implements ServletContextListener {public void contextInitialized(ServletContextEvent servletContextEvent) {String rootPath = System.getProperty("catalina.home");ServletContext ctx = servletContextEvent.getServletContext();String relativePath = ctx.getInitParameter("tempfile.dir");File file = new File(rootPath + File.separator + relativePath);if(!file.exists()) file.mkdirs();System.out.println("File Directory created to be used for storing files");ctx.setAttribute("FILES_DIR_FILE", file);ctx.setAttribute("FILES_DIR", rootPath + File.separator + relativePath);}public void contextDestroyed(ServletContextEvent servletContextEvent) {//do cleanup if needed}}
文件上传下载Servlet实现
对于文件上传,我们将使用Apache Commons FileUpload实用程序,对于我们的项目,我们使用版本1.3,FileUpload取决于Apache Commons IO jar,因此我们需要将二者都放置在项目的lib目录中,如您在上面看到的那样项目结构的图像。
我们将使用DiskFileItemFactory工厂,该工厂提供一种解析HttpServletRequest对象并返回FileItem列表的方法。 FileItem提供有用的方法来获取文件名,字段名,格式,大小和需要上载的文件的内容类型的详细信息。 要将文件写入目录,我们要做的就是创建一个File对象,并将其作为参数传递给FileItem write()方法。
由于Servlet的全部目的是上传文件,因此我们将重写init()方法来初始化Servlet的DiskFileItemFactory
对象实例。 我们将在doPost()方法实现中使用此对象将文件上传到服务器目录。
成功上传文件后,我们将使用URL向客户端发送响应以下载文件,因为HTML链接使用GET方法,因此我们将在URL中添加文件名参数,并且可以使用相同的servlet doGet()方法实施文件下载过程。
为了实现下载文件servlet,首先我们将打开文件的InputStream并使用ServletContext.getMimeType()方法来获取文件的MIME类型并将其设置为响应内容类型。
我们还需要将响应内容的长度设置为文件的长度。 为了确保客户端了解我们正在发送文件作为响应,我们需要将“ Content-Disposition ”标头设置为“ 附件”; filename =“ fileName ”。
完成设置响应配置后,我们可以从InputStream读取文件内容并将其写入ServletOutputStream并将输出刷新到客户端。
我们的UploadDownloadFileServlet servlet的最终实现如下所示。
UploadDownloadFileServlet.java
package com.journaldev.servlet;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;@WebServlet("/UploadDownloadFileServlet")
public class UploadDownloadFileServlet extends HttpServlet {private static final long serialVersionUID = 1L;private ServletFileUpload uploader = null;@Overridepublic void init() throws ServletException{DiskFileItemFactory fileFactory = new DiskFileItemFactory();File filesDir = (File) getServletContext().getAttribute("FILES_DIR_FILE");fileFactory.setRepository(filesDir);this.uploader = new ServletFileUpload(fileFactory);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String fileName = request.getParameter("fileName");if(fileName == null || fileName.equals("")){throw new ServletException("File Name can't be null or empty");}File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileName);if(!file.exists()){throw new ServletException("File doesn't exists on server.");}System.out.println("File location on server::"+file.getAbsolutePath());ServletContext ctx = getServletContext();InputStream fis = new FileInputStream(file);String mimeType = ctx.getMimeType(file.getAbsolutePath());response.setContentType(mimeType != null? mimeType:"application/octet-stream");response.setContentLength((int) file.length());response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");ServletOutputStream os = response.getOutputStream();byte[] bufferData = new byte[1024];int read=0;while((read = fis.read(bufferData))!= -1){os.write(bufferData, 0, read);}os.flush();os.close();fis.close();System.out.println("File downloaded at client successfully");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {if(!ServletFileUpload.isMultipartContent(request)){throw new ServletException("Content type is not multipart/form-data");}response.setContentType("text/html");PrintWriter out = response.getWriter();out.write("<html><head></head><body>");try {List<FileItem> fileItemsList = uploader.parseRequest(request);Iterator<FileItem> fileItemsIterator = fileItemsList.iterator();while(fileItemsIterator.hasNext()){FileItem fileItem = fileItemsIterator.next();System.out.println("FieldName="+fileItem.getFieldName());System.out.println("FileName="+fileItem.getName());System.out.println("ContentType="+fileItem.getContentType());System.out.println("Size in bytes="+fileItem.getSize());File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileItem.getName());System.out.println("Absolute Path at server="+file.getAbsolutePath());fileItem.write(file);out.write("File "+fileItem.getName()+ " uploaded successfully.");out.write("<br>");out.write("<a href=\"UploadDownloadFileServlet?fileName="+fileItem.getName()+"\">Download "+fileItem.getName()+"</a>");}} catch (FileUploadException e) {out.write("Exception in uploading file.");} catch (Exception e) {out.write("Exception in uploading file.");}out.write("</body></html>");}}
下图显示了该项目的示例执行。
您可以从以下网址下载Apache Commons IO jar和Apache Commons FileUpload jar。
- http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
- http://commons.apache.org/proper/commons-io/download_io.cgi
更新内容 :
- 下载ServletFileUploadDownloadExample项目
- 查阅有关Servlet异常处理系列的下一篇文章。
传入的搜索条件:
- 文件下载servlet
翻译自: https://www.javacodegeeks.com/2013/08/servlet-upload-file-and-download-file-example.html
Servlet上传文件和下载文件示例相关推荐
- windows使用cmd连接ftp使用命令上传(put)和下载文件(mget)
连接 中间如果连接断开了可以直接重连使用open 下载 输入"lcd 本地文件目录"(指的是你要将文件下载到的目标目录,如果不输入就是默认c盘的当前系统用户目录下) 输入" ...
- 【备忘】Linux上传文件,下载文件
背景小故事: 这次在迁移服务器的时候要把ssl文件传到Linux里面,但是我又不想用ide来传,之前看同事演示过,当时没记住,感觉他简单操作就可以了,这次打算学会它. 这功能用得不多,平常都不怎么使用 ...
- servlet文件上传下载_Servlet上传文件和下载文件示例
servlet文件上传下载 Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例 ...
- smartupload java_java servlet通过SmartUpload开发文件批量上传、批量下载源码分享
前几天用基础http协议实现单个文件的上传和下载,发现并不能满足项目的需求,比如一次上传下载多个文件.或者是限制上传文件的格式等.于是看了看SmartUpload这个打包好的组件,感觉还不错,分享给大 ...
- java flex 上传文件_使用Flex和java servlet上传文件
资源都是来自网上.本实例将展示使用Flex和java servlet上传文件. 事前准备就是到http://commons.apache.org 下载common-fileupload-1.1.1.j ...
- SpringBoot整合oss实现文件的上传,查看,删除,下载
springboot整合oss实现文件的上传,查看,删除,下载 1.什么是对象存储 OSS? 答:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量. ...
- 原生Servlet 上传文件
依赖jar <dependency><groupId>commons-fileupload</groupId><artifactId>commons-f ...
- Java实现上传(支持多个文件同时上传)和下载
文件上传一直是Web项目中必不可少的一项功能. 项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载) 主要的是FileUploadController,doupload. ...
- 轻松搞定阿里OSS文件上传和图片下载
轻松搞定阿里OSS文件上传和图片下载 目录 1. 阿里云oss账号准备 1.1 注册阿里云账号,并开通OSS存储服务 1.2 创建RAM子用户并使用子账户的AccessKeyId和Access ...
最新文章
- 百度“知识增强的跨模态语义理解技术”获国家技术发明奖
- 第三代测序为什么这么贵?
- MinGW下静态编译、链接Qt 5.0
- vue使用element ui实现下拉列表分页的功能!!!
- js 数组 ajax php,js里面的对象ajax post到php端直接变成数组了?
- 阅读react-redux源码 - 零
- 12位故去的国家最高科技奖得主:科学寰宇,那些永不陨落的“星”
- (八)Locust 设置断言
- java定时器小程序_【微信小程序】使用setTimeout试试定时器
- 验证GridControl Gridview 单元格。
- Oracle Database 11g 下载
- 文字超长隐藏为...ie7不兼容的解决办法
- 一篇就让你懂线程池原理
- sql查询每科成绩最高的人和分数
- treegrid 与java交互_EXTJS实现的TREEGRID(后台java,框架SpringMVC)
- Pinta--一个画图软件
- 科罗拉多州奥罗拉市用基于磁盘的ExaGrid系统取代磁带备份
- 2021-07-03 DTS 驱动 rock1126 添加硬件ucam 驱动
- memcpy 函数详解
- 2018-2021,60+篇阿里研发效能提升合集,都在这里了
热门文章
- jmeter进行性能测试_使用JMeter进行性能测试
- 多云和混合云_多云互操作性!=云服务聚合
- java cucumber_为Java + STANDARD值引入Cucumber
- jpa语法错误_JPA陷阱/错误
- gradle maven_将工件从Gradle自动提升到Maven Central
- matchers依赖_Hamcrest Matchers的高级创建
- 如何使用Java创建AWS Lambda函数
- 使用Quarkus调试容器中的系统测试(视频)
- hibernate 序列_Hibernate身份,序列和表(序列)生成器
- Spring Boot中的@SpringBootConfiguration注释