当前情况:在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插件,以便在中途停留时正确显示该图片。但会触发下载。答案 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;
}
};
通过这种方式,您将手动强制您的回复为内联。