现在的位置: 首页 > 综合 > 正文

java 限制文件下载流量

2018年01月10日 ⁄ 综合 ⁄ 共 2167字 ⁄ 字号 评论关闭

package com.mvc.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller("userController")
@RequestMapping("/user")
public class UserController {
    
    private int count = 0;
    
    @RequestMapping(value = "/add.do")
    public String addUser() {
        // TODO Auto-generated constructor stub
        return "user/add_success";
    }
    
    @SuppressWarnings("static-access")
    @RequestMapping(value = "/download.do")
    @ResponseBody
    /*
     * byte[] bytes = new byte[10240];//每次读入的字节为10k
     * outputStream.flush();//把缓存清空提交数据

     * Thread.currentThread().sleep(1000);//睡眠一秒中

    *这里的count没有用到同步锁,但是有点误差是很有效率的。

     *
     * 即是一秒钟之内提交10k的数据
     */
    public String download(HttpServletRequest request, HttpServletResponse response){
        count++;
        System.out.println("++++Thread  :"+Thread.currentThread().getName());//打印线程名字,可以看到是不同的
        System.out.println("++++count  :"+count);
        response.setContentType("application/x-download");
        response.setHeader("Conten-Disposition", "attachment;filename="+"my.txt");
        File file = new File("/home/tinmoo/chineseAN.txt");
        InputStream inputStream = null;
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            inputStream = new FileInputStream(file);
            byte[] bytes = new byte[512000];//第一次读入的字节为0.5MB
            int length = -1;
            while ((length = inputStream.read(bytes))!= -1 ) {
                    outputStream.write(bytes, 0, length);
                    /*
                     * 下面两句是必须的
                     */
                    outputStream.flush();//把缓存清空提交数据
                    Thread.currentThread().sleep(999);//睡眠一秒中
                    bytes = new byte[900000/count];//根据请求人数控制流量
            }
                
            inputStream.close();
            outputStream.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(count > 0){
            count--;
        }
        return null;
    }
}

抱歉!评论已关闭.