Spring-MVC:如何从控制器流式传输mp3文件

时间:2018-03-20 10:19:29

标签: java spring spring-mvc audio stream

我正在开发一个Spring-MVC应用程序,我试图在其中传输mp3数据。不幸的是,只要响应发送了一个字节数组的信息,它就会直接触发下载。我发现了一些其他的链接,但是大多数链接都与用户界面相关联,所以没什么用处。流式播放mp3文件有哪些要求?这是我的下载代码。

 @RequestMapping(value = "/getsong/{token}")
    public ResponseEntity<byte[]> getsong(@PathVariable("token") String token, HttpServletResponse response) {
        try {
                Path path = Paths.get(FILE_LOCATION);
                response.setContentType("audio/mp3");
                response.setHeader("Content-Disposition", "attachment; filename=\"" + "song.mp3" + "\"");
                response.setContentLength((int) Files.size(path));
                Files.copy(path, response.getOutputStream());
                response.flushBuffer();

        } catch (Exception ignored) {
        }
        return null;
    }

谢谢。

2 个答案:

答案 0 :(得分:3)

您现在可能已经解决了这个问题。但还是只想在这里添加我的评论 - 你正在设置&#39;附件&#39;到Content-Disposition标头。我认为这是每次调用此代码时下载的原因。

答案 1 :(得分:1)

您没有提及您的客户/播放器是什么,但大多数播放器将需要支持部分内容请求(或字节范围)的控制器。

这可能有点棘手,所以我建议使用像Spring Content这样的东西。那么您根本不需要担心如何实现控制器代码。假设您正在使用Spring Boot(如果您不是,请告诉我),那么它看起来像这样:

  

的pom.xml

<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>spring-content-rest-boot-starter</artifactId>
    <version>0.0.10</version>
</dependency>
<dependency>
    <groupId>com.github.paulcwarren</groupId>
    <artifactId>content-fs-spring-boot-starter</artifactId>
    <version>0.0.10</version>
</dependency>
  

SpringBootApplication.java

@SpringBootApplication
public class YourSpringBootApplication {

  public static void main(String[] args) {
    SpringApplication.run(YourSpringBootApplication.class, args);
  }

  @Configuration
  @EnableFilesystemStores
  public static class StoreConfig {
    File filesystemRoot() {
        return new File("/path/to/your/songs");
    }

    @Bean
    public FileSystemResourceLoader fsResourceLoader() throws Exception {
      return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }
  }

  @StoreRestResource(path="songs")
  public interface SongsStore extends Store<String> {
    //
  }
}

这就是在/songs支持流式传输时创建基于REST的电影服务所需的全部内容。它实际上也支持完整的CRUD功能;创建== POST,读取== GET(包括字节范围支持),更新== PUT,删除== DELETE以防对您有用。上传的歌曲将存储在&#34; / path / to / your / songs&#34;中。

所以......假设你的服务器上有/path/to/your/songs/example-song.mp3

GET /songs/example-song.mp3

将返回部分内容响应,这应该在大多数(如果不是全部)玩家中正确传输(包括向前和向后搜索)。

HTH