Java File下载休息服务,byte []数组中的内容

时间:2014-06-25 08:30:19

标签: java rest download

我需要提供一个可以帮助用户下载文件的宁静服务。

我有如下文件的详细信息( byte []数组中的文件内容和文件名)。我见过很少有人使用File对象或FileOutputStream对象,他们可以为attachment文件名等设置标头。我不知道如何将byte[]数组转换为File或可在Response中设置的任何特定对象。我有以下代码下载文件,但id不会向标题添加任何信息(请查看注释代码 - 如果可以修复以消除异常)

我不确定这是否是正确的类型@Produces(MediaType.APPLICATION_OCTET_STREAM),因为文件可以是word文档/ excell或PDF。

@GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    @Path("/download-file")
    public byte[] download(@QueryParam("fileID") Long fileID) {

        byte[] contents = getFileContents(fileID);
        String file_name = getFileName(fileID);
        return contents;

        /* ResponseBuilder response = null; 
        try {
            FileOutputStream out = new FileOutputStream(file_name);
            out.write(contents);
            response = Response.ok((Object) out);
            response.header("content-type", "application/octet-stream");
            out.close();

        } catch (Exception e) {
            e.printStackTrace();

        } 

        response.header("Content-Disposition","attachment; filename="+file_name);
        return response.build();*/
    }

如何返回byte []数组内容以及设置标题内容配置?

上面的代码给了我以下异常

A message body writer for Java class java.io.FileOutputStream, and Java type class java.io.FileOutputStream, and MIME media type application/octet-stream was not found.
The registered message body writers compatible with the MIME media type are:
application/octet-stream ->
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
*/* ->

如果我在其中进行以下更改

,则相同的注释代码可以正常工作
File file = new File(absolute_path_to_file);
response = Response.ok((Object) file);

似乎Response.ok可以接受File对象但不接受任何其他对象,但正如我所提到的,我没有绝对的路径。我将文件contents作为byte []数组。 注意:如果您建议我将这些byte []数组写入文件,然后从该文件创建File对象。 Akhhh! (这将是我的最后选择)。没有写文件我可以实现相同吗???我看到Response.ok可以接受某些OutStream相关对象,但不确定如何通过Response将字节转换为受支持对象之一。

1 个答案:

答案 0 :(得分:1)

您应该将内容类型设置为特定文件的MIME类型。否则,客户端浏览器很难确定如何处理该文件。

此外,您应该在注释后的代码中尝试设置Content-Disposition标头。

但是,您应该返回原始字节数组而不将其包装在任何内容中(尽管您可以使用Response包装器对象来设置正确的标头)