关于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);} } } }
能否在自己扩展完以后,去分享频道写个分享,感谢你的支持