JSF Seam @RequestParameter文件/图像

时间:2011-05-19 09:44:59

标签: jsf file-upload seam

我有一个Backing Bean,其中我读取了未绑定到组件的参数。 Seam提供了读取get参数。我用了

@RequestParameter private String param1;

这样他就不会在验证错误上跳过我的动作方法,就像我使用时一样     < param name =“param1”value =“#{myBean.param1}”/> ,因为我不想呈现HTML响应,而是重用业务逻辑。相反,我抓住响应流并自己编写渲染的响应

FacesContext ctx = FacesContext.getCurrentInstance();

final HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse();      
resp.getOutputStream().write(xml.getBytes());
resp.getOutputStream().flush();
resp.getOutputStream().close();

ctx.responseComplete(); // render response phase done

我试图从HttpServletRequest inputStream中读取该文件,但该文件已经为空。有没有办法从JSF获取“文件”。我可以使用一个单独的servlet并在那里处理它,但这会打破我构建接口其余部分的一点点。

任何建议都是如此。

编辑:仅为了完整性输入流的代码

final HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest();
ServletInputStream stream = request.getInputStream();
int byt = stream.read(); // byt was -1

编辑编辑:对不起,很长的帖子。现在我做了一个单独的servlet。在那里我也得到一个空的输入流,即使Firefug说我传输了文件。怎么可能是空的?

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

boolean isMultipart = ServletFileUpload.isMultipartContent(req);
ServletInputStream stream= req.getInputStream();
int test = stream.read(); // test == -1

servlet代码在单独的项目中工作正常,因此过滤器链中的一个JSF / Seam servlet必须删除数据。如果有人提示哪一个或如何检查。

1 个答案:

答案 0 :(得分:2)

如果是一个POST和多部分请求,SeamFilter或者更确切地说是MultipartFilter正在检查每个请求。如果是这样,他们将请求包装在MultipartRequest中,并将文件放在单独的参数映射中。

final HttpServletRequestWrapper request = (HttpServletRequestWrapper)FacesContext.getCurrentInstance().getExternalContext().getRequest();
final ServletRequest innerRequest = request.getRequest();
if(innerRequest instanceof MultipartRequest){
    byte[] imageData = ((MultipartRequest)innerRequest).getFileBytes("image");