目录
Resource类:
package com.resource;
import com.service.DownloadService;
import com.zte.ums.zenap.commons.api.control.ApiType;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.jvnet.hk2.annotations.Service;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Service
@Slf4j
@Path("/download")
public class DownloadResource {
@Inject
DownloadService downloadService;
/**
* 文件下载接口
* fileName:需要下载的文件名
*/
@GET
@Path("/download/file")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Download file", response = Response.class, tags = {ApiType.UI})
public Response downloadFile(@ApiParam(value = "download file") @QueryParam("fileName") String fileName,
@Context HttpServletRequest request, @Context HttpServletResponse response) {
return downloadService.responseFileDownload(response, fileName);
}
@OPTIONS
@Path("/download/file")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Download file", response = Response.class, tags = {ApiType.UI})
public Response downloadFile(@Context HttpServletRequest request, @Context HttpServletResponse response) {
return Response.ok().header("Allow", "GET, OPTIONS").build();
}
}
Service类:
package com.service;
import com.enty.DownloadFileInterfaceResponse;
import lombok.extern.slf4j.Slf4j;
import org.jvnet.hk2.annotations.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Response;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
@Service
@Slf4j
public class DownloadService {
/**
* 文件下载,将文件流写入 HttpServletResponse中
*/
public Response responseFileDownload(HttpServletResponse response, String fileName) {
//需要下载的文件
File file = new File("/filePath" + File.separator + fileName);
//判断文件是否存在
if (file.exists()) {
//设置响应头
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
//文件存在,下载文件
try (ServletOutputStream out = response.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fileInputStream);
BufferedOutputStream bos = new BufferedOutputStream(out)) {
//将文件内容循环读取并写入响应体
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bos.flush();
//下载成功,状态200
return Response.status(Response.Status.OK).header("Content-Type", "application/json;charset=UTF-8").build();
} catch (Exception e) {
//文件下载失败
log.error("文件下载失败!", e);
DownloadFileInterfaceResponse downloadResponse = new DownloadFileInterfaceResponse();
downloadResponse.setStatus(400);
downloadResponse.setDownloadResult("File download failed," + e.getMessage());
return Response.ok(downloadResponse).build();
}
} else {
//文件不存在
log.warn("File download fail, file path does not exist");
DownloadFileInterfaceResponse downloadResponse = new DownloadFileInterfaceResponse();
downloadResponse.setStatus(400);
downloadResponse.setDownloadResult("文件不存在");
return Response.ok(downloadResponse).build();
}
}
}
实体类:
package com.enty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DownloadFileInterfaceResponse {
private volatile Integer status;
private volatile String downloadResult;
}