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 ”标头设置为“ attachment”。 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
参考: 开发者食谱博客上的JCG合作伙伴 Pankaj Kumar的Servlet上传文件和下载文件示例 。

翻译自: https://www.javacodegeeks.com/2013/08/servlet-upload-file-and-download-file-example.html

servlet文件上传下载

servlet文件上传下载_Servlet上传文件和下载文件示例相关推荐

  1. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  2. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  3. java 上传文件及预览_SpringBoot上传下载文件及在线预览

    SpringBoot上传下载文件及在线预览 今天大概就说说如何使用SpringBoot进行上传和下载以及在线预览文件 本篇主要介绍上传下载的功能,对于界面就简单一点,大致如下: 一.老规矩还是先看看小 ...

  4. 文件上传表单 上传文件的细节 文件上传下载和数据库结合

    1 文件上传表单    1)上传文件的本质是文本复制的过程    2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写    3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方 ...

  5. springboot文件上传下载实战 —— 登录功能、展示所有文件

    springboot文件上传下载实战 创建项目 pom.xml 数据库建表与环境准备 建表SQL 配置文件 application.properties 整体架构 前端页面 登录页面 login.ht ...

  6. SpringBoot实现文件单文件上传、批量上传、下载

    一.搭建一个SpringBoot框架 没有搭建的小伙伴,先去搭建一个 SpringBoot框架快速入门搭建Hello Worldhttps://blog.csdn.net/KangYouWei6/ar ...

  7. 利用mysql实现上传和下载_文件上传表单 上传文件的细节 文件上传下载和数据库结合...

    1 文件上传表单 1)上传文件的本质是文本复制的过程 2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写 3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方式,例如: IE6 ...

  8. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  9. xshell上传本地文件命令_linux学习 XShell上传、下载本地文件到linux服务器

    (一)通过命令行的方式 1.linux服务器端设置 在linux主机上,安装上传下载工具包rz及sz; 如果不知道你要安装包的具体名称,可以使用yum provides */name 进行查找系统自带 ...

最新文章

  1. MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml
  2. R语言可视化散点图、气泡图、动态气泡图、数据点重合的散点图、数据点计数图、抖动数据点图、基于lm方法或者loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注
  3. RMAN简明教程之五——RMAN还原和恢复
  4. nginx+lua 配置302 不改写白名单哈希表
  5. JSP标签和JSTL标签注意点
  6. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
  7. Python学习入门基础教程(learning Python)--6.4 Python的list与函数
  8. 单片机c语言模块化实例程序设计,单片机C语言模块化设计
  9. 爷青结,Microsoft 放弃 Windows 95 时代的图标
  10. 【Ubuntu操作系统】命令行解析函数getopt/getopt_long
  11. 《系统集成项目管理》第四章 项目管理一般知识
  12. 计算机管理 网络连接服务,WZC服务未开启无法连接网络 解决方法及步骤
  13. 【网易互娱模拟笔试】解题记录
  14. IMAP4协议介绍nbsp;工作原理
  15. win10升级助手_关闭win10系统更新
  16. 除法运算符号“/” ——不同形式参数,商的不同
  17. realme刷机鸿蒙教程,realmeX一键解锁BL教程(realme手机解锁BL详解教程)
  18. flexf布局中的flex-grow和flex-shrink的计算方法,flex简写的规则
  19. html整体居中文字,html里文字居中代码怎么写?
  20. 2021阳城一中高考成绩查询,山西高考分数线,晋城一中、阳城一中高考捷报这里都有...

热门文章

  1. 1、oracle数据库简介
  2. java实现下载时进度条提示
  3. IDEA一定要改的8条配置
  4. 阿里巴巴对Java编程【异常处理】的规约
  5. C#的float、double与decimal
  6. 使用ueditor实现多图片上传案例——实体类(Shopping.java)
  7. zookeeper 屁民
  8. 铜仁学院计算机报名,铜仁学院2012年3月全国计算机等级考试报名时间通知
  9. html 中一个格子拆分成两个_一个效果惊人的数字游戏
  10. DevExperience(1710)