【问题标题】:Return a file from Controller in Spring在 Spring 中从 Controller 返回文件
【发布时间】:2012-10-29 10:25:33
【问题描述】:

我是春天的新手。我有一个带有多个 GET 参数的 RequestMapping 控制器。他们返回一个 String 。 但是一种方法需要返回“/res/”文件夹中的文件。我该怎么做?

@RequestMapping(method = RequestMethod.GET,value = "/getfile")
public @ResponseBody 
String getReviewedFile(@RequestParam("fileName") String fileName)
{
    return //the File Content or better the file itself
}

谢谢

【问题讨论】:

标签: spring spring-mvc


【解决方案1】:

感谢@JAR.JAR.beans。这是链接:Downloading a file from spring controllers

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody 
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
    return new FileSystemResource(myService.getFileFor(fileName)); 
}

【讨论】:

  • 除此之外,您还可以返回具有动态生成内容的文件。您需要在 ResponseEntity 中返回 byte[] 并使用适当的标头来执行此操作。这是一个例子:allaboutspringframework.com/…
【解决方案2】:

也许这会有所帮助

@RequestMapping(method = RequestMethod.GET,value = "/getfile")
public @ResponseBody 
void getReviewedFile(HttpServletRequest request, HttpServletResponse response, @RequestParam("fileName") String fileName)
{
    //do other stuff
    byte[] file = //get your file from the location and convert it to bytes
    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType("image/png"); //or whatever file type you want to send. 
    try {
        response.getOutputStream().write(image);
    } catch (IOException e) {
        // Do something
    }
}

【讨论】:

    【解决方案3】:

    另一种方式,虽然Jatin's answer 更酷:

    //Created inside the "scope" of @ComponentScan
    @Configuration
    public class AppConfig extends WebMvcConfigurerAdapter {
        @Value("${files.dir}")
        private String filesDir;
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
                    .addResourceHandler("/files/**")
                    .addResourceLocations("file:" + filesDir);
        }
    }
    

    从:

    【讨论】:

    • 好的,如果我想让https://my-site.com/prefix/to/remove/file.png 返回/images/file.png 怎么办?我应该在addResourceHandler 中写什么来指定必须删除/prefix/to/remove parth?到目前为止,我看到 Spring 试图找到 /images/prefix/to/remove/file.png 而不是 /images/file.png
    【解决方案4】:

    这对我来说就像一个魅力:

    @RequestMapping(value="/image/{imageId}", method = RequestMethod.GET)
        public ResponseEntity<byte[]> getImage(@PathVariable String imageId) {
            RandomAccessFile f = null;
            try {
                f = new RandomAccessFile(configs.getImagePath(imageId), "r");
                byte[] b = new byte[(int)f.length()];
                f.readFully(b);
                f.close();
                final HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.IMAGE_PNG);
                return  new ResponseEntity<byte[]>(b, headers, HttpStatus.CREATED);
            } catch (Exception e) {
                return null;
            }
        }
    

    【讨论】:

      【解决方案5】:

      如果您在本地 Windows 机器上工作,这可能对您有用:

      @RequestMapping(value="/getImage", method = RequestMethod.GET)
          @ResponseBody
          public FileSystemResource getUserFile(HttpServletResponse response){
      
              final File file = new File("D:\\image\\img1.jpg");
      
              response.reset();
              response.setContentType("image/jpeg");
      
      
              return new FileSystemResource(file);
          }
      

      为了测试您的代码,您可以使用 Postman “使用 Send And Download 而不仅仅是 send

      另一种方法返回字节

      @GetMapping("/getAppImg")
          @ResponseBody
          public byte[] getImage() throws IOException {
      
              File serveFile = new File("image_path\\img.jpg");
      
              return Files.readAllBytes(serveFile.toPath());
          }
      

      【讨论】:

        猜你喜欢
        • 2015-02-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2021-02-22
        • 1970-01-01
        • 2014-07-23
        • 2014-01-06
        • 2020-07-04
        相关资源
        最近更新 更多