代码:
@RestController
@RequestMapping("/download")
public class DownloadController {
@GetMapping("/studentWork")
public ResponseEntity<StreamingResponseBody> downloadStudentWork() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
String encodedFileName = "作品名称-学生姓名.zip";
// StringBuffer stringBuffer = new StringBuffer();
// stringBuffer.append("作品名称"+"-学生姓名.zip");
//
try {
encodedFileName = URLEncoder.encode(encodedFileName, StandardCharsets.UTF_8.toString());
System.out.println(encodedFileName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
headers.setContentDispositionFormData("attachment", encodedFileName);
StreamingResponseBody responseBody = outputStream -> {
try (ZipOutputStream zipOut = new ZipOutputStream(outputStream)) {
// 假设这是学生的作品海报图片文件流
InputStream imgStream = getStudentPosterData();
addToZip(zipOut, imgStream, "作品封面.jpg");
// 添加更多附件,如果有的话
zipOut.finish();
} catch (IOException e) {
// 处理异常
}
};
return new ResponseEntity<>(responseBody, headers, HttpStatus.OK);
}
private void addToZip(ZipOutputStream zipOut, InputStream inputStream, String fileName) throws IOException {
ZipEntry zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
zipOut.write(buffer, 0, bytesRead);
}
zipOut.closeEntry();
inputStream.close();
}
// 获取学生作品海报图片数据的示例方法
private InputStream getStudentPosterData() throws FileNotFoundException {
FileInputStream inputStream = new FileInputStream("C:\\Users\\admin\\Pictures\\Saved Pictures\\微信图片_20230914093742.png");
String filePath = "C:\\Users\\admin\\Pictures\\Saved Pictures\\微信图片_20230914093742.png";
File file = new File(filePath);
if (file.exists()){
System.out.println("文件存在");
}else {
throw new RuntimeException();
}
return inputStream;
}
示例: