【第22期】观点:IT 行业加班,到底有没有价值?

原生servlet配合smartupload实现批量下载和批量上传

原创 2016年05月31日 21:10:25

废话不多说,直接贴代吗

页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  ${msg }
  上传
  <form action="<%=basePath %>/SmartServlet" method="post" enctype="multipart/form-data">
  <input type="file" name="file1">
    <input type="file" name="file2">
      <input type="file" name="file3">
        <input type="file" name="file4">
  <input type="submit" value="上传">
  </form>

  <hr/>
  批量下载
   <form action="<%=basePath%>/SmartDownServlet" method="get">
        <input type="checkbox"  name="filename" value="img1.jpg">Image2
        <input type="checkbox"  name="filename" value="img2.jpg">Image3
        <input type="checkbox"  name="filename" value="img3.jpg">Image4
        <input type="submit" value="下载">
     </form> 
  </body>
</html>

批量上传,servlet代码,需要注意的是需要将表单设置为enctype=”multipart/form-data”,这样就会以二进制流的形式传输表单

package com.leige.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jspsmart.upload.SmartUpload;

public class SmartServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String path=this.getServletContext().getRealPath("/img");
        System.out.println(path);
        SmartUpload smartUpload=new SmartUpload();
        //初始化对象
        smartUpload.initialize(getServletConfig(), request, response);
                //设置上传文件大小
        smartUpload.setMaxFileSize(1024*1024*10);
                //设置所有文件的大小
        smartUpload.setTotalMaxFileSize(1024*1024*100);
                //设置允许上传文件类型
        smartUpload.setAllowedFilesList("txt,jpg,gif,png");
                String result = "上传成功!";

                    try {
                        //设置禁止上传的文件类型
                        smartUpload.setDeniedFilesList("rar,jsp,js");
                        //上传文件
                        smartUpload.upload();
                        int count = smartUpload.save(path);
                        System.out.println("上传成功" +  count + "个文件!");
                    } catch (Exception e) {
                    //smartupload定义的一些错误代码,挑出常用的
                        result = "上传失败!";
                        if(e.getMessage().indexOf("1015") != -1){
                            result = "上传失败:上传文件类型不正确!";
                        }else if (e.getMessage().indexOf("1010") != -1){
                            result = "上传失败:上传文件类型不正确!";
                        }else if (e.getMessage().indexOf("1105") != -1){
                            result = "上传失败:上传文件大小大于允许上传的最大值!";
                        }else if (e.getMessage().indexOf("1110") != -1){
                            result = "上传失败:上传文件总大小大于允许上传总大小的最大值!";
                        }
                        e.printStackTrace();
                    } 
                request.setAttribute("msg", result);
                request.getRequestDispatcher("/index.jsp").forward(request, response);

    }

}

批量下载,需要注意的是,当用户选择批量下载时,我们不可能每个文件都弹出一个下载框,这样在体验上也不好,而且大量数据不经过压缩,就传输,也是对带宽的浪费,所以好的解决办法,压缩成包:

package com.leige.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import com.jspsmart.upload.Files;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

public class SmartDownServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);

    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //设置请求头信息
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-Disposition", "attachment;filename=test.zip");
        String path = getServletContext().getRealPath("/") + "img/";
        //初始化smartupload
        SmartUpload sm=new SmartUpload();
        sm.initialize(getServletConfig(), request, response);
        sm.setContentDisposition(null);
        String[] fileNames=request.getParameterValues("filename");
        String str = "";
        String rt = "\r\n";
        //返回一个压缩包
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
        for(String filename : fileNames){
            str += filename + rt;
            File file = new File(path + filename);
            zos.putNextEntry(new ZipEntry(filename));
            FileInputStream fis = new FileInputStream(file);
            //复制文件到压缩流中
            IOUtils.copy(fis, zos);     
            zos.flush();
            fis.close();
        }
        //设置注释
        zos.setComment("下载成功:" + rt + str);
        zos.flush();
        zos.close();
    }

}

下载和上传使用非常广泛,希望大家能掌握住

版权声明:本文为博主原创,要转载留个名先 举报

相关文章推荐

什么是跨域?怎么解决跨域问题?

什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子...

JAVA Servlet 上传批量上传大文件

新建类 UploadServlet package org.action; import java.io.File; import java.io.IOException; import ...

bootstrap File Input 多文件上传插件使用记录(一)配置及批量同步上传

bootstrap file input 多文件上传工具,功能十分强大,也很完善,我也是在接触了这个插件后自己研究使用的,当然也踩了很多的坑,主要是官方API是英文的,可能没兴趣一行一行的读,只能是用...

shell脚本进行sftp文件批量上传与下载

使用linux 的shell脚本进行sftp文件上传与下载批量上传:#!/bin/bash#SFTP配置信息 #用户名 USER=root #密码 PASSWORD=5EYS40T04BMF #待上传...

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

说明:Plupload支持多种浏览器,多种上传方式!       一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的...

动态添加控件以及批量上传文件

1、例程 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object se...

网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在《Android网络编程之使用HTTP访问网络资源》一文中介绍过HttpCient的...

android批量文件上传(android批量图片上传)

项目中多处用到文件批量上传功能,今天正好解决了此问题,在此写出来,以便日后借鉴。 首先,以下架构下的批量文件上传可能会失败或者不会成功:             1.android客户端+spri...

批量上传文件

前台:页面; --%> 前台: js:   function Ad...

FTP 批量上传文件和文件夹 自动递归

其实是一个工具,ncftp 太他妈好用了, 下载地址在 http://www.ncftp.com/ 一句话自动递归目录,文件夹, 文件,全部上传到服务器 安装后,使用  ncftpput -R ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)