是的,Java的ResponseEntity可以返回文件流。你可以使用HttpHeaders
来设置响应头,然后使用InputStreamResource
来包装文件流,最后将InputStreamResource
作为参数传递给ResponseEntity
的构造函数。以下是一个简单的示例:
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@RestController
public class FileDownloadController {
@GetMapping("/download")
public ResponseEntity<InputStreamResource> downloadFile(HttpServletRequest request) throws IOException {
// 设置文件路径
String filePath = "/path/to/your/file.txt";
File file = new File(filePath);
// 检查文件是否存在
if (!file.exists()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"));
// 创建文件输入流
InputStream inputStream = new FileInputStream(file);
// 使用InputStreamResource包装文件输入流
InputStreamResource resource = new InputStreamResource(inputStream);
// 返回ResponseEntity
return ResponseEntity.status(HttpStatus.OK).headers(headers).body(resource);
}
}
在这个示例中,我们创建了一个名为FileDownloadController
的控制器,其中有一个名为downloadFile
的方法。这个方法接收一个HttpServletRequest
参数,用于获取请求信息。我们首先设置文件路径,然后检查文件是否存在。接下来,我们设置响应头,包括内容类型和内容处置表单数据。然后,我们创建一个文件输入流,并使用InputStreamResource
将其包装起来。最后,我们返回一个包含文件输入流的ResponseEntity
对象。