https://www.bilibili.com (http:www.acfun.cn/)

*载下**文件Servlet

package com.what21.servlet.upload;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Decoder;

@WebServlet("/download/http")
public class DownloadServlet extends HttpServlet {

    private static final long serialVersionUID = 4629166931478547720L;

    private static BASE64Decoder decoder = new BASE64Decoder();

    /**
     * 根据文件参数读取文件,然后完成*载下**
     */
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 根据参数判断文件
        String filename = request.getParameter("filename");
        if ((filename == null) || ("".equals(filename))) {
            return;
        }
        filename = new String(URLDecoder.decode(filename, "UTF-8"));
        File file = new File(filename);
        if (!file.exists()) {
            return;
        }
        // 制定*载下**格式和*载下**文件大小
        if (file.getName().equals(".zip")) {
            response.setHeader("Content-type", "application/zip");
        } else if (file.getName().equals(".rar")) {
            response.setHeader("Content-type", "application/rar");
        } else {
            response.setContentType("application/octet-stream");
        }
        String downloadName = URLEncoder.encode(file.getName(), "UTF-8");
        response.setHeader("Content_Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "attachment; filename=" + downloadName);
        // 读取输入流然后输出文件
        FileInputStream input = new FileInputStream(file);
        DataInputStream dis = new DataInputStream(input);
        byte[] bt = new byte[1024];
        int r = -1;
        while ((r = dis.read(bt)) != -1) {
            response.getOutputStream().write(bt, 0, r);
        }
        response.getOutputStream().flush();
    }

}

视频流Servlet

package com.what21.servlet.upload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@WebServlet("/service/video")
public class VideoStreamServlet extends HttpServlet {

    private static final long serialVersionUID = 6948918204420124894L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String diskPath = "D:/Temp/";
        String diskFilename = "mda-mb3dct11xfevbuay.mp4";
        response.setContentType("video/mpeg4");
        byte[] data = getBytesFromFile(new File(diskPath + diskFilename));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + diskFilename + "\"");
        OutputStream os = response.getOutputStream();
        os.write(data);
    }

    /**
     * 读取文件字节
     *
     * @param file
     * @return
     * @throws IOException
     */
    private static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);
        long length = file.length();
        if (length > Integer.MAX_VALUE) {
            return null;
        }
        byte[] bytes = new byte[(int) length];
        int offset = 0;
        int numRead = 0;
        while ((offset < bytes.length) && ((numRead = is.read(bytes, offset, bytes.length - offset)) >= 0)) {
            offset += numRead;
        }
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }
        is.close();
        return bytes;
    }

}