spring boot上传文件时数据流二次读取如何解决啊?
如果没有文件上传,可以写一个包装器
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于json类型的请求 如果你只是要拿到body,进行业务操作的话
可以使用requestbodyadvice
他提供了解析前和解析后的方法
可以把文件保存到本地的/tmp目录里面,java有System方法获取系统的临时目录。
然后把文件实际存储的绝对路径,加到
request.setAttribute()
里面。后面业务处理时,通过这个路径获取到文件内容。
你既然重写了getInputStream,本来就没必要再保留body这个变量了