我正在为我的一个项目使用带有REST服务的spring MVC。我有附加和下载用户文件的服务。 我使用以下服务API上传并将文件保存到服务器目录
http://myrestserver/attachmentService/attach/userKey
以下服务API用于从服务器目录下载文件
http://myrestserver/attachmentService/download/userKey/fileKey
问题是,下载文件时,下载的URL会显示REST服务API URL。为了避免这种情况,我想到了为附加和下载文件编写控制器。
我写了一个处理文件附件过程的弹簧控制器。即使我写了一个控制器(比如download.do)来下载文件,但是当下载文件时,文件名显示为控制器的同名(下载的文件名始终显示"download.do"
)而不是原始文件名。
以下代码来自我的download.do
控制器
WebResource resource = null;
resource = client.resource("http://myrestserver/attachmentService/download/userKey/fileKey");
clientResponse = resource.accept(MediaType.APPLICATION_OCTET_STREAM).get(
ClientResponse.class);
InputStream inputStream = clientResponse.getEntityInputStream();
if(inputStream != null){
byteArrayOutputStream = new ByteArrayOutputStream();
try {
IOUtil.copyStream(inputStream, byteArrayOutputStream);
} catch (IOException e) {
log.error("Exception in download:"+ e);
}
}
而且,在我的服务API中,代码是
file = new File(directory, attachmentFileName);
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(attachmentContent);
fileOutputStream.close();
response = Response.ok((Object) file).type(MediaType.APPLICATION_OCTET_STREAM);
response.header("Content-Disposition", "attachment; filename=" + "\"" + attachmentFileName
+ "\"");
return response.build();
通过分析问题,我明白了,我没有通过download.do
控制器在下载文件中设置文件头。
如果我在download.do
控制器中使用outstream,我将无法设置文件头。
任何人都可以帮我解决这个问题。我的主要目的是通过MVC控制器按流来隐藏我的休息服务URL。 我在堆栈溢出中发现了一个帖子(Downloading a file from spring controllers),就像我的问题一样,但文件类型以前是已知的。请注意,在我的应用程序中,用户可以附加任何类型的文件。
答案 0 :(得分:3)
在将文件写入输出流之前,必须先设置Content-Disposition。一旦开始写入输出流,就不能再设置标题了。