setHeader不会更改文件名

时间:2016-04-17 19:06:58

标签: java playframework hbase

当我使用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的表,它有两个家庭contentbookcontent包含pdf(以字节为单位)的内容,book包含pdf的一些属性(标题,页码,作者等)。 Row Keycontent的{​​{1}}是相同的。

有没有其他方法可以通过使用变量来设置文件名,或者我错过了什么?

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