java文件下载接口

本文介绍了Java中的Resource类,通过DownloadService和实体类DownloadFileInterfaceResponse实现了一个支持文件下载的RESTfulAPI接口,展示了如何使用HK2注解和JAX-RS规范进行服务注册和处理HTTP请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Resource类:

Service类:

实体类:


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值