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

Couchdb Wicket ByteArrayResource只能下载:我可以让浏览器处理MIME类型吗?,couchdb,bytearray,wicket,mime-types,wicket-1.5,Couchdb,Bytearray,Wicket,Mime Types,Wicket 1.5,当前情况:在Java代码中,我通过Ektorp库从CouchDB获取带有附件的文档。这些文档被映射到Java对象中,所有这些都可以正常工作。为了使这些附件可以在浏览器中访问,我正在实例化一个ByteArrayResource,其中文档附件为字节数组、内容类型和文件名: private ByteArrayResource handleAttachment(String key, String cType) { ByteArrayResource res = null; Attach

当前情况:在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”get在浏览器中显示,“application/pdf”也由浏览器处理(Safari例如,立即显示pdf)

我如何才能实现这一点与Wicket?任何帮助是感激的。请记住,我不希望共享资源,我的网站是安全的。谢谢


PS:有意思的是,如果我打开其中一个带有“rel=”prettypto“属性的“image”内容类型资源链接,我会得到JQuery prettypto插件,以便在布局中正确显示该图片。但是,浏览器会触发下载。

我看到您使用的是ByteArrayResource的构造函数版本,它还接收输入文件名(这是代码中的第三个参数“key”)。通过tearrayresource这样做会将响应配置为“附件”,这就是为什么您总是获得“保存”对话框的原因。尝试忽略关键参数以查看是否获得所需的行为

如果要保留文件名信息,可以尝试覆盖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;
  }
};

通过这种方式,您将手动强制响应内联。

太好了,就是这样!我用这种方式丢失了文件名信息,我想在用户右键单击“另存为”时无法保存它?不管怎么说,我把这个标记为答案,因为它是有效的,并且帮助了我。非常感谢。那(几乎)工作得很好当通过关联菜单立即保存链接的资源时,Safari会保留正确的文件名。Chrome只有“另存为”选项,现在可以正确填写文件名。唯一的问题是:如果我点击“另存为”而不是“保存”,Safari(与Chrome不同)不会保留文件名。但我想这是一个狩猎问题,因为它在Chrome中工作。再次感谢!