servlet文件上传下载_Servlet上传文件和下载文件示例

servlet文件上传下载

Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例。

用例

我们的用例是提供一个简单HTML页面,客户端可以在其中选择要上传到服务器的本地文件。 在提交上传文件的请求后,我们的Servlet程序会将文件上传到服务器中的目录中,然后提供URL,用户可以通过该URL下载文件。 出于安全原因,不会为用户提供下载文件的直接URL,而是会为他们提供下载文件的链接,并且我们的Servlet将处理请求并将文件发送给用户。

我们将在Eclipse中创建一个动态Web项目,项目结构如下图所示。

Servlet-文件-上传-下载

让我们研究一下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>");}}

下图显示了该项目的示例执行。

Servlet文件上传表格

Servlet文件上传成功

Servlet-文件-下载

您可以从以下网址下载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文件上传下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollydbg使用教程学习总结(一)

解密系列之OD使用教程1 使用例子程序为Hello.exe OD基本快捷键及功能 从系统DLL领空返回到程序领空&#xff0c;AltF9 通过OD将程序的标题“Hello world”改为“OD Class 01” 直接单步执行法 按F8单步执行&#xff0c;找到MessageBox传参的地方&#xff0c;直接在数据窗口修…

Python连锁药店营业额数据分析实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 附件drug. order_ detai 1.xlsx是某连锁药店销售数据&#xff0c;请使…

Python计算细胞核与细胞质的面积比opencv或pil实验

前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击跳转人工智能学习资料&#xff09; 一、题目 根据附件cell.jipg&#xff0c;使用opencv库或者PIL库计算细胞核与细胞…

Ollydbg使用教程学习总结(二)

解密系列之OD使用教程4 程序1&#xff1a;RegisterMe.exe 把程序跑一遍之后我们发现程序有两个NAG&#xff0c;一个是在程序界面启动前出现&#xff0c;另一个是在程序关闭后出现的。 去掉第一个Nag方法如下&#xff1a; ①jmp跳过 ②全部nop掉 ③令hOwner参数为1&#xf…

Python基于Django的电影推荐系统和论坛项目完整源码

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;电影论坛 获…

Ollydbg使用教程学习总结(三)

解密系列之OD使用教程9 程序&#xff1a;MrBills.exe 点击注册&#xff0c;输入邮箱和序列号后提示如下 突破口&#xff1a;该提示窗口中的字符串&#xff0c;查找如下 双击来到反汇编窗口&#xff0c;有个关键跳转&#xff0c;往上查看影响跳转的语句是test al,al&#xf…

Python用matplotlib绘制曲线实验

一、题目 计算出每组数据的均值和标注差&#xff0c;用matplotlib画出如下风格。横轴是每组的序号&#xff0c;即1&#xff0c;2&#xff0c;… 10&#xff0c;曲线的圆点对应均值&#xff0c;颜色范围为标注差&#xff0c;显示垂直和水平网格线。 二、题目分析 首先分析这…

Ollydbg使用教程学习总结(五)

解密系列之OD使用教程17——inline patch 程序&#xff1a;ReverseMe. NAGs.exe 新内容&#xff1a;硬件断点 用PEID打开&#xff0c;看到程序是用VC6.0写的&#xff0c;用OD载入&#xff0c;按F9运行后&#xff0c;出现NAG窗口&#xff0c;在OD中按下暂停&#xff0c;再打开堆…

Python的Wine数据集分类scikit-learn和K近邻实验

一、题目 请使用scikit-learn库和K近邻分类器完成Wine数据集的分类&#xff0c;训练比例自定。(数据下载: https://archive.ics.uci.edu/ml/datasets/Wine) 二、题目分析 这道题目就是获取数据然后分类的过程。首先在网站上下载好数据。然后回到Pycharm导入实验所需要的skle…

[MEGA DEAL]完整的Java捆绑包(96%折扣)

深入了解编程奥德赛&#xff08;58小时&#xff01;&#xff09;&#xff0c;进入最常用的编程语言 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了另一个超值优惠 。 我们为The Complete Java Bundle提供96&#xff05;的…

基于PLC十字路口交通灯控制(可计算车流量、调整时间等)课程设计毕业设计

微信公众号&#xff1a;创享日记 发送&#xff1a;plc交通灯 获取完整论文报告&#xff08;内含梯形图程序、无水印流程图等&#xff09; 按照城市交通控制的需要&#xff0c;本文讨论了用PLC实现正常时序、急车强通2种控制方式&#xff0c;通过传感器与PLC完成对交通异常状况&…

Ollydbg使用教程学习总结(四)

解密系列之OD使用教程13——迷途 程序&#xff1a;XoftSpy41._96.exe 用PEID查看&#xff0c;是VC6编写的程序&#xff0c;用OD载入 获取文本框输入内容API&#xff1a;GetWindowTextA API下断方法&#xff1a; a.右键>查找>所有模块间的调用&#xff0c;直接输入API&am…

基于PLC高层楼房供水系统课程设计毕业设计

设计目的 &#xff08;1&#xff09;能够检测到水箱的水位并用指示灯显示。 &#xff08;2&#xff09;由检测到水箱的水位&#xff0c;实现3台电机的供水要求。 &#xff08;3&#xff09;设计plc程序。 设计要求 &#xff08;1&#xff09;确定输入/输出设备。 &#xff08;…

基于PLC四层电梯模型控制系统课程设计

总设计要求 1.1 电梯上行设计要求 ①当电梯停于1F或2F、3F时&#xff0c;4F呼叫&#xff0c;则上行到4F&#xff0c; 碰行程开关后停止。 ②当电梯停于1F或2F时&#xff0c;3F呼叫&#xff0c;则_上行到3F&#xff0c;碰行程开关后停止。 ③当电梯停于1F时&#xff0c;2F 呼叫…

基于西门子PLC s7-200 的自动立体车库设计自动化设计(控制器步进电机直流电机)

本组的设计题目是《基于 PLC 的立体车库设计》&#xff0c;本组设计包括机械设计&#xff0c;电路设计以及程序设计。在设计中遇到了很多困难&#xff0c;参考了相关资料&#xff0c;与老师进行多次沟通&#xff0c;一边学习一边制作&#xff0c;以厂家资料为标准进行修改&…

基于51单片机的8八路抢答器设计

基于51单片机的8路抢答器 具体功能&#xff1a; &#xff08;1&#xff09;主持人进行复位&#xff0c;依次显示8位选手的分数&#xff0c;8位选手分数显示结束后主持人方可按下开始按键&#xff1b; &#xff08;2&#xff09;主持人按下抢答开始按键&#xff0c;抢答者才可以…

基于51单片机的简易抢答器设计

基于51单片机的简易抢答器 具体功能&#xff1a; 1、主持人按下抢答开始按键&#xff0c;抢答者才可以开始抢答&#xff0c;数码管抢答倒计时20S。 2、抢答者按下按键&#xff0c;数码管显示抢答者的编号。 3、可以通过按键修改倒计时时间。 部分程序代码&#xff1a; #incl…

Word2019中Visio对象图片插入题注时自动删除标签与编号前的空格,编号后添加空格

问题引入 撰写论文时为了修改方便&#xff0c;通常以插入题注和交叉引用的方式来给图片标号&#xff0c;这样修改图片和图号后可以方便、自动地更新。 然而&#xff0c;Word在插入题注上从03到13一直没有针对中国用户优化。 插入题注的标签与编号间有一个空格&#xff0c;当…

【32位win7一键扫雷】32位win7系统自带扫雷游戏逆向分析之一键扫雷(附VS代码工程文件、可执行文件和OD分析缓存文件)

实现效果 视频地址:https://www.zhihu.com/zvideo/1373742900744974336 附一张扫雷自定义中难度最大时进行一键扫雷的截图,如下,24*30,共668颗雷。 前言 一直对逆向感兴趣,就拿最简单的扫雷开始,对于XP系统中的扫雷,雷的数目以及雷区的地址都是固定的,可以直接通过…

基于51单片机的智能电子秤设计课程设计毕业设计

微信公众号&#xff1a;创享日记 对话框发送&#xff1a;单片机电子秤 获取仿原理图、真源文件、源程序代码和论文报告等 由STC89C51单片机最小系统LCD1602液晶显示模块HX711AD模块LED模块蜂鸣器按键模块10kg压力传感器构成。 具体功能&#xff1a; 1、数码管显示当前的重量&a…