关于FileRender的一个建议,希望能拥有给予输入流的构造方法(内存中的文件下载)

关于FileRender的一个建议,希望能拥有给予输入流的构造方法。FileRender在工作的时候也是通过文件输入流读取文件,然后输入流和输出流循环。那么,是否可以再进一步抽取,抽取去一个构造,是给予输入流的。关于文件的构造的话,就是调用给予输入流的构造就好了,在调用之前把文件的File变成文件输入流就OK了。

说说是很简单的,相信做起来应该不容易,希望波大大能够采纳把。因为在文件下载的时候,会有这样的需求,文件是在内存中构造的,不想在保存到磁盘中了,直接下载就好,但是貌似JF中并没有非常可行的方法,所以希望能这样吧?!

顺便贴一下我的解决方法,内存中的文件下载,参考了波大大的FileRender类写的。如果是内存中的文件的话,可以通过ByteArrayOutputStream转换成字节数组,再从字节数组通过ByteArrayInputStream转换成输入流,对于能存在内存中的文件,浪费点就浪费点吧。

	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-20 10:29

这个需求确实有几个人提出来过,当时我是建议他们自己先通过创建 MyRender extneds Render 类扩展出来用的,用的时候这样 render(new Myrender(...)),jfinal 2.3 考虑一下这个需求,但优先级不高,太多功能需要在 2.3 中添加

能否在自己扩展完以后,去分享频道写个分享,感谢你的支持

sruz

2016-10-20 14:18

@JFinal 只能说试试看吧,,主要是因为改写FileRender中的Content-Range有点困难

JFinal

2016-10-20 16:48

@xRhbN 不要去扩展或改写 FileRender,因为 FileRender 支持了断点继传,不适合扩展成为那种可以支持网络资源的 Render,单写个 Render 是最好的

sruz

2016-10-20 18:49

@JFinal 那我上面贴出来的那个Render不已经简单实现了吗?

JFinal

2016-10-20 19:09

@xRhbN 没仔细看,还以为你想扩展 FileRender ^_^

sruz

2016-10-21 08:59

@JFinal 嗯嗯,,只是觉得FileRender 中可以再抽取出一个流的构造方法而已,,,但是如果说有断点续传的话,那就没法抽了的,,,之前没看明白那个range是干啥子滴

热门反馈

扫码入社