文件下载之流下载、字节数组下载(内存中生成的文件的下载)

文件下载之流下载、字节数组下载(FileRender提供了已经存在的文件的下载,但是内存中生成的文件的下载就只能另辟蹊径了)。本宝宝还是直接贴代码吧!

	public class BinaryRender extends Render {

	private InputStream in;
	private String fileName;
	
	public BinaryRender(byte[] bytes, String fileName){
		in = new ByteArrayInputStream(bytes);
		this.fileName = fileName;
	}
	
	public BinaryRender(InputStream in, String fileName){
		this.in = in;
		this.fileName = fileName;
	}
	
	@Override
	public void render() {
		OutputStream outputStream = null;
		InputStream inputStream = null;
		try {
			response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes(getEncoding()), "ISO8859-1"));
			String contentType = request.getSession().getServletContext().getMimeType(fileName);
			response.setContentType(contentType != null ? contentType : "application/octet-stream");
			inputStream = new BufferedInputStream(in);
	        outputStream = response.getOutputStream();
            byte[] buffer = new byte[1024];
            for (int len = -1; (len = inputStream.read(buffer)) != -1;) {
                outputStream.write(buffer, 0, len);
            }
            outputStream.flush();
		} catch (IOException e) {
        	if (getDevMode()) {
        		throw new RenderException(e);
        	}
        } catch (Exception e) {
        	throw new RenderException(e);
        } finally {
            if (inputStream != null)
                try {inputStream.close();} catch (IOException e) {LogKit.error(e.getMessage(), e);}
            if (outputStream != null)
            	try {outputStream.close();} catch (IOException e) {LogKit.error(e.getMessage(), e);}
        }
	}

}

评论区

JFinal

2016-10-21 09:31

content type 可以固定为 "application/octet-stream",因为仅凭一个 fileName 当前是无法获取到这个值的,以前的 FileRender 是因为 fileName 关联到了一个 File 对象才可以。代码简洁干净,感谢分享

sruz

2016-10-21 10:56

@JFinal 如果我记得没错的话,getMimeType方法是按照后缀名来判断Mime类型的吧?那fileName 里面带上后缀名不就好了?!

gaols

2016-10-27 09:32

为什么这个地方需要 new String(fileName.getBytes(getEncoding()), "ISO8859-1")

gaols

2016-10-27 09:57

@xRhbN 求解 为什么需要new String(fileName.getBytes(getEncoding()), "ISO8859-1") 没有会怎样?乱码?

sruz

2016-11-07 08:59

@gaols 抱歉奥,好久没来了,你可以试一下,应该是会乱码的,,,至于是什么原因把,不是很了解,我是COPY 波大大的 FileRender 类 然后改吧改吧来的,,,,

easymbol

2017-08-08 10:56

测试您的代码时候发现在内容中存在中文的时候会出现乱码

easymbol

2017-08-08 10:57

@JFinal 波总,为何在生成文件时,文件内容存在中文的时候是乱码呢

JFinal

2017-08-08 11:48

@easymbol 写一个简单的 main 方法去实现这个写入文件的功能,确保不出乱码以后,再将这段代码转用到 jfinal 之中

通过这种方式可以确定,写入文件的行为与 jfinal 没有关系,其实 jfinal 并没有提供任何写入文件内容的功能,所以肯定是与 jfinal 无关的

easymbol

2017-08-08 11:51

@JFinal 刚刚找到了问题,传入byte的时候需要转换为utf-8 不然在Linux下面的时候中文就是乱码