我正在为我的一个项目使用带有 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。我在堆栈溢出中发现了一个帖子(从弹簧控制器下载文件),几乎就像我的问题一样,但文件类型是以前已知的。请注意,在我的应用程序中,用户可以附加任何类型的文件。