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

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

本文内容:

  • servlet实现下载功能
  • servlet实现上传功能

首发日期:2018-07-21


servlet实现下载功能

实现流程

1.首先制作一个jsp页面,主要是用来触发下载的。这里可以根据你的想法来做,当然servlet那边就要相应的更改了。我这里使用一个简单的a标签来触发。

2.设置响应信息,告诉浏览器要将传过来的数据识别成下载;根据提交上来的数据找到对应文件,转成流,返回给浏览器;

中文文件名问题:

  • 虽然真的不建议使用中文文件名。但还是给一下处理手段。

先给出触发的条件:

中文文件名需要解决两个问题:

1.浏览器提交上来的中文文件名要识别:这里是普通的get和post的中文数据问题

get方式:String filename = new String(filename.getBytes("iso-8859-1"),"utf-8"); 【tomcat8不需要】

post方式:request.setCharacterEncoding("utf-8")

2.返回给浏览器时,浏览器能识别,即能正确显示回来的下载文件名(如果你下载东西遇到过文件名乱码,就是这个没处理好):

处理方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 1.获取下载目标
    String filename = request.getParameter("target");
    System.out.println(filename);
    // 2.找到下载目标
    String path = getServletContext().getRealPath("download/" + filename);
    File file = new File(path);
    if (file.exists()) {
      // 3.如果文件存在,那么设置响应的内容为下载,告诉浏览器将信息识别成下载
      // 判断一下浏览器
      String agent = request.getHeader("User-Agent");
      if (agent.contains("Firefox")) {// 火狐
        BASE64Encoder base64Encoder = new BASE64Encoder();
        filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
      } else {// ie和谷歌
        filename = URLEncoder.encode(filename, "utf-8");
      }
      response.setHeader("Content-Disposition", "attachment; filename=" + filename);
      // 4.获取文件流
      FileInputStream fis = new FileInputStream(file);
      OutputStream os = response.getOutputStream();
      // 5.返回给浏览器
      int len = 0;
      byte[] buffer = new byte[1024];
      while ((len = fis.read(buffer)) != -1) {
        os.write(buffer, 0, len);
      }
      os.flush();// flush一下,确保一下
      os.close();
      fis.close();
    } else {
      response.setContentType("text/html;charset=UTF-8");
      response.getWriter().write("找不到文件");
    }

  }

servlet实现上传功能

1.创建一个页面,用于上传:【这里只用了一个上传,但事实上下面的代码是支持多个上传的】

【当使用了enctype="multipart/form-data"之后,普通输入框的内容,将无法使用getParameter获取

2.导入包,以便使用fileupload:commons-fileupload-1.2.1.jar和commons-io-1.4.jar【这里导入io包主要是用于io流对接,上传的文件流直接对接输出流;如果你不导入,那么需要手动处理流中的数据!】

3.创建DiskFileItemFactory工厂类,用来:DiskFileItemFactory factory=new DiskFileItemFactory();

4.创建解析类,用于解析resquest:ServletFileUpload upload=new ServletFileUpload(factory);

5.解析内容,获取一个list,数据都存储在list中:List<FileItem> list = upload.parseRequest(request);

现在信息封装方法已经跟之前没有文件上传时不一样了,所以需要解析:

6.操作list【list中的每一个元素都是FileItem对象,可以用FileItem对象.isFormField()来判断是否是表单项(认为文件是上传项);如果是真的话,说明是普通的输入框内容,如果你想要存储输入框提交的内容,那么这里可以处理一下;不为真说明是上传项,这里可以针对流进行操作】

如何操作?

对于普通表单项:item.getFieldName()可以获取对应的name;item.getString()可以获取对应的值

对于上传项,需要操作它的流:item.getInputStream()可以获取对应的数据流。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    DiskFileItemFactory factory=new DiskFileItemFactory();//1.创建DiskFileItemFactory工厂类
    ServletFileUpload upload=new ServletFileUpload(factory);//2.创建解析类,用于解析resquest
    try {
      List<FileItem> list = upload.parseRequest(request);//3.解析内容,获取一个list,数据都存储在list中
      for(FileItem item:list) {
        if(item.isFormField()) {//判断是否是普通的表单内容
          System.out.println(item.getFieldName());//获取的是表单中name属性的值
          System.out.println(item.getString());//获取的是对应的表单的值
        }else {//为假,说明是上传项
          //获取流,进行处理
          InputStream ism = item.getInputStream();
          String path=getServletContext().getRealPath("/upload/");
          System.out.println(path);
          String filename = item.getName();//这里getName可以获取文件名
          System.out.println(filename);
          File file=new File(path+filename);
          file.createNewFile();//这里不做文件存在性和名字重复判断
          OutputStream fos = new FileOutputStream(file);
          //这里直接借助commons.io来做io对接,不然需要做流的读取和写入
          IOUtils.copy(ism,fos);//把输入流的数据拷贝到输出流
          IOUtils.closeQuietly(ism);
          IOUtils.closeQuietly(fos);

        }
      }
    } catch (FileUploadException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

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

(0)

相关推荐

  • java基于servlet使用组件smartUpload实现文件上传

    文件上传在web应用中是非常常见的,现在我就介绍下基于servlet的文件上传,基于Struts2的文件上传可以看: 页面端代码: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <ht

  • java基于servlet实现文件上传功能

    本文实例为大家分享了java基于servlet实现文件上传的具体代码,供大家参考,具体内容如下 研究了一天终于将java上传文件看懂了,当然懂的仅仅是皮毛,不妨记下来防止以后忘了. 我们在网上看关于文件的上传有很多的介绍,当然有的可以使用有的则不合适:我们首先来看前台的界面. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <tit

  • 简单操作实现Java jsp servlet文件上传过程解析

    实现文件上传的方式 1.进入http://commons.apache.org/proper/commons-fileupload/using.html 2.点击用户指南 3.对着用户指南一步步复制粘贴,并把代码撸成自己想要的样子 补充:记得要将commons-io-2.4.jar和commons-fileupload-1.2.2.jar这两个包放到编译器里面 现成的代码 JSP 前端页面 <%-- Created by IntelliJ IDEA. User: Administrator Da

  • java基于servlet实现文件上传功能解析

    最近项目需要做一个文件上传功能,做完了分享下,顺带当做笔记. 上传功能用后台用java实现,前端主要是js的ajax实现.后台还加入定时删除临时文件. 效果如图 首先是上传功能的主要类,下面是代码 package util.upload; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterat

  • Java Servlet简单实例分享(文件上传下载demo)

    项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

  • 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

  • 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

  • Java Servlet上传图片到指定文件夹并显示图片

    在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/image)的图片.主要步骤如下: 步骤一:上传页面uploadphoto.jsp 需要注意两个问题: 1.form 的method必须是post的,get不能上传文件, 还需要加上enctype="multipart/form-data" 表示提交的数据是二进制文件. 2.需要提供type=&

  • java web中的servlet3 upload上传文件实践

    Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作. 一.javax.servlet.http中Part接口 public interface Part 要上传文件必须使用multipart/form-data作为request body. 版本: Servl

  • java基于servlet的文件异步上传

    在这里使用了基于servlet的文件异步上传,好了废话不多说,直接上代码了... package com.future.zfs.util; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.s

  • 基于java文件上传-原始的Servlet方式

    前言:干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的.刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感觉最不爽的时候,没有归属感,房租还不便宜,RT,不能好高骛远,还是脚踏实地一点一点学技术吧,终将有一日,工资会涨的. java文件上传 传统的文件上传,不用jquery插件的话,就是用form表单提交,项目里用过uploadify,可以异步上传文件,原理我也没研究.现在说传统的form表单上传文件.

随机推荐