使用流通过Spring MVC控制器下载文件

时间:2013-08-05 04:49:32

标签: java rest spring-mvc file-io url-routing

我正在为我的一个项目使用带有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),就像我的问题一样,但文件类型以前是已知的。请注意,在我的应用程序中,用户可以附加任何类型的文件。

1 个答案:

答案 0 :(得分:3)

在将文件写入输出流之前,必须先设置Content-Disposition。一旦开始写入输出流,就不能再设置标题了。