我需要提供一个可以帮助用户下载文件的宁静服务。
我有如下文件的详细信息( 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
可以接受某些Out
或Stream
相关对象,但不确定如何通过Response
将字节转换为受支持对象之一。
答案 0 :(得分:1)
您应该将内容类型设置为特定文件的MIME类型。否则,客户端浏览器很难确定如何处理该文件。
此外,您应该在注释后的代码中尝试设置Content-Disposition标头。
但是,您应该返回原始字节数组而不将其包装在任何内容中(尽管您可以使用Response包装器对象来设置正确的标头)