servlet实现文件上传与下载功能

本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下

内容

我们分两大模块来进行讲解,即上传的实现,与下载的实现

上传的实现

注意了我们在写上传表单的时候必须声明提交方式为post类型,enctype="multipart/form-data",这样的话才能实现上传。

当我们提交表单的时候看看响应体中都有什么内容:

好了,我们有了数据了,接下来我们怎么提取数据呢,注意我们已经不能使用requeest.getParamter()方法来进行参数的提取了,那怎么办呢,我们总不能自己写实现类来进行分割吧!我们可以使用Commons提供的小工具。

好了,让我们来看看具体的操作步骤吧!这里我就不详细说了,一文代码流过:

/**
 * 需要解决的问题:
 * 1 必须要把文件存放到WEB-INF目录下,避免用户看到
 * 2 文件名相关问题
 * 1 有的浏览器会传递绝对路径到name中,我们只需要进行拆分即可
 * 2文件重名问题,我们可以使用uuid
 * 3文件名乱码问题,我们已经解决了。即request.setCharacterEncoding("utf-8");
 * 3 文件打散问题
 * 1通过首字符打散
 * 2通过时间打散
 * 3通过hash打散
 * 4上传文件大小限制
 * 1单个文件上传大小限制
 * 2总文件上传大小限制
 * 设置这两个参数时,我们必须在没有解析之前执行。
 * 5 缓存大小与临时目录
 *
 *
 *
 **/
public class FileUploadServlet extends HttpServlet {
 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 request.setCharacterEncoding("utf-8");
 response.setContentType("text/html;charset=utf-8");
 /**
 * 我们使用commmons的小工具来进行编码
 * 设置jsp页面的enctype= “multipart/form-data“;
 * 1 创建FileItem工厂
 * 2创建ServletFileUpload对象
 * 3 解析request得到FileItem
 * 4对FileItem进行操作
 **/
 String path = request.getSession().getServletContext().getRealPath("/WEB-INF");
 //解决缓存大小,要不然你的内存会爆的。
 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024 * 10,new File(path + "/" + "tmp2") );
 ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);

 List<FileItem> l = null;
 try {
 l = fileUpload.parseRequest(request);

 FileItem f2 = l.get(0);

 //解决文件存放在WEN_INF目录下问题

 path = path + "/tmp";

 //解决浏览器传递绝对路径问题
 String name = f2.getName();

 int i = name.lastIndexOf("/");
 if(i != -1) {
 name = name.substring(i);
 }

 //解决文件重名问题
 name = (UUID.randomUUID().toString().replace("-","").trim()) + name;

 //文件打散问题解决方法演示之hash打散
 int has = name.hashCode();
 //转换位16进制位,我们使用前两个值来判断

 String hex = Integer.toHexString(has);
 path = path + "/" + hex.charAt(0) + "/" + hex.charAt(2) ;
 File file = new File(path);
 if(! file.exists()) {
 file.mkdirs();
 }

 f2.write(new File(path + "/" + name));
 request.setAttribute("msg","恭喜你,上传成功了!");
 request.getRequestDispatcher("/index.jsp").forward(request, response);

 } catch (Exception e) {
 request.setAttribute("msg",e.getMessage());
 request.getRequestDispatcher("/index.jsp").forward(request, response);
 }
 }
}

好了,上传的问题基本就解决了。

下载的实现

下面我们来看一下下载问题的解决方案

下载文件是我们必须来设置两个响应头,设置Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx要不然我们输出的内容不会弹出保存框,只会显示在浏览器中。

设置Content-Type:你传递给客户端的文件是什么MIME类型

然后我们就可以new一个输入流来读取本地硬盘中的文件,在输出到ServleoutputStream中

在来一行代码流过:

public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 /**
 * 设置两个响应头
 * 1Content-Type:你传递给客户端的文件是什么MIME类型
 * 2Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
 *
 * 需要解决的的问题:
 * 1 下载文件名中文乱码问题
 * 解决方法:
 * 针对不同的浏览器使用不同的编码方式 火狐浏览器使用的是Base64编码,其他浏览器一般都是使用url编码
 **/
 String mimeType = request.getSession().getServletContext().getMimeType("\\WEB-INF\\tmp\\2\\5\\"
 + "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");
 //解决文件名乱码问题
 String filename = "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi";
 filename = encoding(filename, request);
 //两个请求头
 response.setHeader("Content-Type",mimeType);
 response.setHeader("Content-Disposition","attachment;filename=" + filename);
 ServletOutputStream out = response.getOutputStream();
 String path = request.getSession().getServletContext().getRealPath("\\WEB-INF\\tmp\\2\\5\\"
 + "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");
 File file = new File(path);

 FileInputStream inputStream = new FileInputStream(file);

 IOUtils.copy(inputStream, out, 1024*1024);

 }

 private String encoding(String filename,HttpServletRequest req) throws UnsupportedEncodingException {
 String user_agent = req.getHeader("User-Agent");
 String encodingFileName = null;
 if(user_agent.contains("Firefox")) {
 //按道理来说应该使用 BASE64Encoder进行编码,但是不知道为什么不能成功
 /*BASE64Encoder base64Encoder = new BASE64Encoder();
 encodingFileName = "=?utf-8?B?"
  + base64Encoder.encode(filename.getBytes("utf-8"))
  + "?=";*/
 //那我们只能使用这种方式了
 encodingFileName = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
 }
 else {
 encodingFileName = URLEncoder.encode(filename,"utf-8");
 }
 return encodingFileName;
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Jsp+Servlet实现文件上传下载 文件上传(一)

    文件上传和下载功能是Java Web必备技能,很实用. 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上传.后续会逐步实现下载,展示文件列表,上传信息持久化等. 废话少说,直接上代码 第一步,引用jar包,设置上传目录 commons-fileupload-1.3.1.jar commons-io-2.4.jar 上传目录:WEB-INF/tempFiles和WEB-INF

  • servlet实现文件上传、预览、下载、删除功能

    servlet实现文件上传,预览,下载和删除,供大家参考,具体内容如下 一.准备工作: 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转成JSON对象需要jar包:commons-beanutils-1.8.3.jar.commons-collections-3.2.1.jar.commons-lang-2.6.jar.commons-logging-1.1.

  • jsp+servlet实现文件上传与下载功能

    本文实例为大家分享了jsp servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 上传: 需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.Http

  • JavaWeb servlet实现下载与上传功能的方法详解

    本文实例讲述了JavaWeb servlet实现下载与上传功能的方法.分享给大家供大家参考,具体如下: 本文内容: servlet实现下载功能 servlet实现上传功能 首发日期:2018-07-21 servlet实现下载功能 实现流程 1.首先制作一个jsp页面,主要是用来触发下载的.这里可以根据你的想法来做,当然servlet那边就要相应的更改了.我这里使用一个简单的a标签来触发. 2.设置响应信息,告诉浏览器要将传过来的数据识别成下载:根据提交上来的数据找到对应文件,转成流,返回给浏览

  • Jsp+Servlet实现文件上传下载 文件列表展示(二)

    接着上一篇讲: Jsp+Servlet实现文件上传下载(一)--文件上传 本章来实现一下上传文件列表展示,同时优化了一下第一章中的代码. 废话少说,上代码 mysql创建附件表 DROP TABLE tbl_accessory; CREATE TABLE tbl_accessory ( id INT AUTO_INCREMENT PRIMARY KEY, file_name VARCHAR(500), file_size DOUBLE(10,2), file_ext_name VARCHAR(1

  • java基于servlet编写上传下载功能 类似文件服务器

    本人闲来无事,写了个servlet,实现上传下载功能.启动服务后,可以在一个局域网内当一个小小的文件服务器. 一.准备工作 下载两个jar包: commons-fileupload-1.3.1.jar commons-io-2.2.jar 二.创建一个web工程 我的工程名叫:z-upload 三.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht

  • JSP servlet实现文件上传下载和删除

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 由于存储空间,对一般用户而言,就是用来操作存储文件的,所以这两天,特意看了一下windows下用servlet实现文件上传.下载和删除,下面是详细代码说明 上传: 用的是commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar组件,可以去apache官网上去下载,然后放到WebRoot/WEB-INF/lib目录下 upload.html <html> <hea

  • Jsp+Servlet实现文件上传下载 删除上传文件(三)

    接着上一篇讲:Jsp+Servlet实现文件上传下载(二)--文件列表展示 本章来实现一下删除已上传文件,同时优化了一下第一章中的代码. 废话少说,上代码得意 1.调整列表页面list.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/j

  • JavaServlet的文件上传和下载实现方法

    先分析一下上传文件的流程 1-先通过前段页面中的选择文件选择要上传的图片 index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 T

  • Servlet实现文件的上传与下载

    前言: 文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下 实现条件: 1.需要一个form标签,method为post请求 2.form的encType属性值为multipart/form-data 3.input标签的type=file 4.需要的jar包() 工程目录: 具体实现: UploadServlet.java(上传) import org.apache.commons.fileupload.FileItem; import org.apache

随机推荐