2

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

4

1 回答 1

3

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

于 2013-08-13T11:12:52.273 回答