spring boot上传文件时数据流二次读取如何解决啊?

发布于 2022-09-12 13:38:22 字数 1658 浏览 25 评论 0

如果没有文件上传,可以写一个包装器

package dry.framework.service;
import dry.base.service.StreamService;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class RequestWrapperService extends HttpServletRequestWrapper {
    private String body;
 public RequestWrapperService(HttpServletRequest request) {
        super(request);
 try {
            body = new String(StreamService.readStream(request.getInputStream()));
 } catch (IOException e) {
            e.printStackTrace();
 }
    }
    public String getBody() {
        return this.body;
 }
    @Override
 public ServletInputStream getInputStream() {
        final ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes());
 return new ServletInputStream() {
            @Override
 public boolean isFinished() {
                return false;
 }
            @Override
 public boolean isReady() {
                return false;
 }
            @Override
 public void setReadListener(ReadListener readListener) {
            }
            @Override
 public int read() {
                return is.read();
 }
        };
 }
    @Override
 public BufferedReader getReader() {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
 }
}

然后在过滤器里面这样返回改写的请求对象

chain.doFilter(new RequestWrapperService(r), response);

如果有文件上传,把文件流存成字符串不合适吧,该怎么写呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一抹微笑 2022-09-19 13:38:22

对于json类型的请求 如果你只是要拿到body,进行业务操作的话
可以使用requestbodyadvice
image.png
他提供了解析前和解析后的方法

别理我 2022-09-19 13:38:22

可以把文件保存到本地的/tmp目录里面,java有System方法获取系统的临时目录。
然后把文件实际存储的绝对路径,加到request.setAttribute()里面。
后面业务处理时,通过这个路径获取到文件内容。

甜味拾荒者 2022-09-19 13:38:22

你既然重写了getInputStream,本来就没必要再保留body这个变量了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文