当我使用filename的变量来设置下载文件的名称时,它看不到变量。但是,如果我不使用变量的文件名,那么它设置我想要的名称。
response().setHeader("Content-disposition", "attachment; filename=testName.pdf");
这样,下载文件的名称为testName.pdf
我尝试了三种不同的方法将它与变量一起使用。
response().setHeader("Content-disposition", "attachment; filename="+ fileName.toString() +".pdf");
或
..... "attachment; filename="+ fileName +".pdf");
或
..... "attachment; filename="+ fileName.toString() +".pdf");
完整代码:
public static Result download(String id) throws IOException {
Get g = new Get(Bytes.toBytes(id));
g.addColumn(Bytes.toBytes("content"), Bytes.toBytes("raw"));
g.addColumn(Bytes.toBytes("book"), Bytes.toBytes("title"));
HTable hTable = new HTable(hConn.config, "books");
org.apache.hadoop.hbase.client.Result result = hTable.get(g);
if (result.containsColumn(Bytes.toBytes("content"), Bytes.toBytes("raw"))){
byte[] rawBook = result.getNoVersionMap().get(Bytes.toBytes("content")).get(Bytes.toBytes("raw"));
byte[] fileName = result.getNoVersionMap().get(Bytes.toBytes("book")).get(Bytes.toBytes("title"));
response().setContentType("application/octet-stream");
response().setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\".pdf");
return ok(rawBook);
}
return notFound();
}
所以,这是来自Java Play Framework。数据库是HBase。我有一个名为books
的表,它有两个家庭content
和book
。 content
包含pdf(以字节为单位)的内容,book
包含pdf的一些属性(标题,页码,作者等)。 Row Key
和content
的{{1}}是相同的。
有没有其他方法可以通过使用变量来设置文件名,或者我错过了什么?
答案 0 :(得分:2)
看起来问题在于将String
转换为toString()
。该数组上的简单[B@186b085
会导致类似filename
的内容 - 此处不接受AFAIK为byte[]
。
尝试将String
转换为String fn = new String(filename, "UTF-8");
,如下所示:
UnsupportedEncodingException
请注意,编码始终很重要,但使用此构造函数时,您必须捕获UnsupportedEncodingException
。
在Java 8中,您可以使用以下内容,而无需捕获String fn = new String(filename, java.nio.charset.StandardCharsets.UTF_8);
:
# Require your environment file to bootstrap Rails
require ::File.dirname(__FILE__) + '/config/environment'
# Serve static assets from RAILS_ROOT/public directory
# use Rails::Rack::Static
# Dispatch the request
run ActionController::Dispatcher.new