繁体   English   中英

spring boot如何像PHP的readfile函数一样实时返回字节流?

[英]How does spring boot return byte stream in real time like PHP's readfile function?

我正在解决一个需求。 我正在使用 springboot 框架。 现在有一个接口,传入参数url。 这个url是一个网络文件地址。 接口收到请求后,使用自己的网络请求网络文件,并实时返回给客户端。 ,php的readfile函数可以解决问题,但是java语言有没有这样的解决方法呢? 我需要的是实时返回给客户端,而不是读取全部返回给客户端

@Controller
@Api(tags = "test")
@RequestMapping("/test")
@CrossOrigin
public class TestController {

    @RequestMapping(value = "/get", method = RequestMethod.POST)
    @ApiOperation(value = "get")
    public ResponseEntity<FileSystemResource> test() throws IOException {
      
        OkHttpClient client = new OkHttpClient().newBuilder()
                .build();
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, "{\"123\": 1}");
        Request request = new Request.Builder()
                .url("https://github.com/xujimu/ios_super_sign/archive/refs/heads/master.zip")
                .method("GET", body)
                .addHeader("Content-Type", "application/json")
                .build();
        Response response = client.newCall(request).execute();
        
    }


}

您可以为此使用ResponseEntity<StreamingResponseBody>

您已选择要返回的内容类型。 我们最终得到了produces = MediaType.APPLICATION_NDJSON_VALUE

我们必须通过将RestClient to更改为 WebClient 来修改我们执行休息请求的方式:

Flux<DataBuffer> dataStream = return webClient.method(method)
                .uri(url)
                .retrieve()
                .bodyToFlux(DataBuffer.class);

DataBufferUtils.write(dataStream, response.getOutputStream())
                .map(DataBufferUtils::release)
                .blockLast();

当我们终于让它工作时,它真的很好用:)

您可以在https://www.baeldung.com/spring-mvc-sse-streams上看到一些其他示例。

我通过java的URL类解决了这个问题

package com.api.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;
import com.api.common.result.PageReq;
import com.api.common.result.PageResult;
import com.api.common.result.Result;
import com.api.common.user.AddBalanceReq;
import com.api.constant.ResultCode;
import com.api.dao.ApiUserDao;
import com.api.dao.UserFlowDao;
import com.api.entity.ApiUserEntity;
import com.api.entity.UserFlowEntity;
import com.api.execption.ResRunException;
import com.api.service.ApiUserService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpHeaders;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import reactor.core.publisher.Flux;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.DataBuffer;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;


@Controller
@Api(tags = "test")
@RequestMapping("/test")
@CrossOrigin
public class TestController {
 
    /**
     * 添加用户月
     *
     * @param req
     * @return
     */
    @RequestMapping(value = "/get", method = RequestMethod.GET)
    @ApiOperation(value = "get")
    public void test(String url, HttpServletResponse response) throws IOException {

        URL url1 = new URL(url);

        InputStream is = url1.openStream();

        int ch;
        while ((ch = is.read()) != -1) {
            response.getWriter().write(ch);
        }
        
    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM