我正在开发一个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;
}
谢谢。
答案 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