Wicket ByteArrayResource只能下载:我可以让浏览器处理MIME类型吗?

时间:2012-08-04 14:21:55

标签: couchdb bytearray wicket mime-types wicket-1.5

当前情况:在Java代码中,我通过Ektorp库从CouchDB获取带附件的文档。这些文档被映射到Java对象,一切正常。为了在浏览器中访问这些附件,我将实例化一个ByteArrayResource,文档附件为字节数组,内容类型和文件名:

private ByteArrayResource handleAttachment(String key, String cType) {
    ByteArrayResource res = null;
    AttachmentInputStream attIS = CouchDB.INSTANCE.getCouchDbConnector().getAttachment(doc.getId(), key);
    InputStream is = new BufferedInputStream(attIS);
    try {
        // Convert InputStream to byte[] with Apache commons-io
        byte[] bytes = IOUtils.toByteArray(is);
        attIS.close();
        is.close();
        res = new ByteArrayResource(cType, bytes, key);
    } catch (IOException e) {
        logger.error("", e);
    }
    return res;
}

然后我只是在我的页面上添加一个ResourceLink:

ByteArrayResource resource = handleAttachment(key, cType);
add(new ResourceLink("resLink", resource));

问题是:当我在浏览器中点击该链接时,无论内容类型是什么,所有附件都在下载。当我通过浏览器直接从CouchDB访问这些附件时,“image / xxx”内容类型在浏览器中打开图像,“text / xxx”显示在浏览器中,“和”application / pdf“也被处理通过浏览器(Safari例如立即显示PDF)。

如何通过Wicket实现这一目标?任何帮助表示赞赏。请记住,我不想要共享资源,我的网站是安全的。谢谢!

PS:有趣的是,如果我用“rel =”prettyPhoto“属性打开其中一个”图像“内容类型的ResourceLinks,我会得到JQuery PrettyPhoto插件,以便在中途停留时正确显示该图片。但会触发下载。

2 个答案:

答案 0 :(得分:0)

我看到你正在使用ByteArrayResource的构造函数版本,它也输入了文件名(它是代码中的第三个参数'key')。这样做ByteArrayResource将响应配置为'ATTACHMENT',这就是你总是得到保存对话框的原因。尝试省略关键参数以查看是否获得了所需的行为。

答案 1 :(得分:0)

如果您想保留文件名信息,可以尝试覆盖ByteArrayResource的newResourceResponse方法,如下所示:

res = new ByteArrayResource(cType, bytes, key){
  @Override
  protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes){
    AbstractResource.ResourceResponse rr = super.newResourceResponse(attributes)
    rr.setContentDisposition(ContentDisposition.INLINE);
    return rr;
  }
};

通过这种方式,您将手动强制您的回复为内联。