Couchdb Wicket ByteArrayResource只能下载:我可以让浏览器处理MIME类型吗?
当前情况:在Java代码中,我通过Ektorp库从CouchDB获取带有附件的文档。这些文档被映射到Java对象中,所有这些都可以正常工作。为了使这些附件可以在浏览器中访问,我正在实例化一个ByteArrayResource,其中文档附件为字节数组、内容类型和文件名: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
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中工作。再次感谢!