SpringMVC 文件下载学习

103 阅读1分钟
package com.kdy.controller;

import com.sun.deploy.net.HttpResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.jws.WebService;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class DownloadController {


    /*
    * 基于servlet api  的文件下载
    * */

    @RequestMapping("download")
    public void download(@RequestParam( value = "filename",required = false) String str, HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String realPath;
        System.out.println(str);
        if(str.equals("china")){
            realPath = req.getServletContext().getRealPath("/upload/a.pptx");
        }else{
            realPath = req.getServletContext().getRealPath("/upload/b.png");

        }
        File tmpfile = new File(realPath);
        String fileName = tmpfile.getName();

        resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));


        InputStream in = new FileInputStream(realPath);


        int len = 0 ;
        byte[] buffer = new byte[1024*1024];
        long begintime = System.currentTimeMillis();
        ServletOutputStream outputStream = resp.getOutputStream();
        while ((len = in.read(buffer)) >0){
            outputStream.write(buffer,0,len);
        }
        long endtime =System.currentTimeMillis();


        System.out.println(endtime-begintime);


        in.close();



    }

    /**
     * 基于spring ResponseEntity的文件下载 不支持缓冲区
     *  ResponseEntity 可以定制响应内容  响应头 响应编码
     * */
    @RequestMapping("dl2")
    public ResponseEntity<String>  download02(){
        String body="hello world";
        //MultiValueMap
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Set-Cookie","name=buzhidao");

        return new ResponseEntity<String>(body,httpHeaders, HttpStatus.BAD_GATEWAY);

    }


    @RequestMapping("download03")
    public ResponseEntity<byte[]> download03(HttpServletRequest req,HttpServletResponse resp) throws IOException {


        String realPath = req.getServletContext().getRealPath("/upload/a.pptx");

        File tmpfile = new File(realPath);
        String fileName = tmpfile.getName();


        //resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
        InputStream in = new FileInputStream(realPath);




       // ServletOutputStream outputStream = resp.getOutputStream();


        byte[] bytes = new byte[in.available()];

        in.read(bytes,0,in.available());

        return new ResponseEntity<byte[]>(bytes,httpHeaders,HttpStatus.OK);

    }

}