From ebbd2c0440db08e355a4e45b176d6bf9e9dac1f7 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 3 Jun 2024 15:36:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E8=AF=B7=E6=B1=82=E6=8B=A6=E6=88=AA):?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86=E6=96=87=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E8=AF=B7=E6=B1=82=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/api/config/ExceptionInterceptor.java | 1 + .../ai/api/servlet/XinDispatcherServlet.java | 14 ++- .../xjy/ai/api/wrapper/RequestWrapper.java | 94 +++++++------------ 3 files changed, 50 insertions(+), 59 deletions(-) diff --git a/share-api/src/main/java/com/xjy/ai/api/config/ExceptionInterceptor.java b/share-api/src/main/java/com/xjy/ai/api/config/ExceptionInterceptor.java index ddd9066..b7cb49f 100644 --- a/share-api/src/main/java/com/xjy/ai/api/config/ExceptionInterceptor.java +++ b/share-api/src/main/java/com/xjy/ai/api/config/ExceptionInterceptor.java @@ -77,6 +77,7 @@ public class ExceptionInterceptor { @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler({Exception.class}) public ResponseData handle(HttpServletRequest request, Exception e) { + e.printStackTrace(); return DataPacketUtil.errorJsonResult(ResponseEnum.SYS_ERROR.getValue()); } diff --git a/share-api/src/main/java/com/xjy/ai/api/servlet/XinDispatcherServlet.java b/share-api/src/main/java/com/xjy/ai/api/servlet/XinDispatcherServlet.java index 6abb2a4..81abe0a 100644 --- a/share-api/src/main/java/com/xjy/ai/api/servlet/XinDispatcherServlet.java +++ b/share-api/src/main/java/com/xjy/ai/api/servlet/XinDispatcherServlet.java @@ -1,6 +1,8 @@ package com.xjy.ai.api.servlet; import com.xjy.ai.api.wrapper.RequestWrapper; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.http.HttpServletRequest; @@ -8,6 +10,8 @@ import javax.servlet.http.HttpServletResponse; public class XinDispatcherServlet extends DispatcherServlet { + private final MultipartResolver multipartResolver = new StandardServletMultipartResolver(); + /** * 包装成我们自定义的request * @param request @@ -16,6 +20,14 @@ public class XinDispatcherServlet extends DispatcherServlet { */ @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { - super.doDispatch(new RequestWrapper(request), response); + HttpServletRequest processedRequest = request; + + if (multipartResolver.isMultipart(request)) { + processedRequest = multipartResolver.resolveMultipart(request); + } else { + processedRequest = new RequestWrapper(request); + } + + super.doDispatch(processedRequest, response); } } diff --git a/share-api/src/main/java/com/xjy/ai/api/wrapper/RequestWrapper.java b/share-api/src/main/java/com/xjy/ai/api/wrapper/RequestWrapper.java index d33a7de..0347c2a 100644 --- a/share-api/src/main/java/com/xjy/ai/api/wrapper/RequestWrapper.java +++ b/share-api/src/main/java/com/xjy/ai/api/wrapper/RequestWrapper.java @@ -5,96 +5,74 @@ import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; -import java.io.*; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import java.nio.charset.Charset; +import java.util.stream.Collectors; -/** - * 将request请求里面的inputStream复制一份出来放到固定参数里面 - * - */ public class RequestWrapper extends HttpServletRequestWrapper { + private final byte[] body; public RequestWrapper(HttpServletRequest request) { super(request); - String bodyStr = getBodyString(request); - body = bodyStr.getBytes(Charset.defaultCharset()); + if (!isMultipartContent(request)) { + String bodyStr = getBodyString(request); + body = bodyStr.getBytes(Charset.defaultCharset()); + } else { + body = new byte[0]; + } + } + + private boolean isMultipartContent(HttpServletRequest request) { + return request.getContentType() != null && request.getContentType().toLowerCase().startsWith("multipart/"); } public String getBodyString(final ServletRequest request) { - try{ - return inputStream2String(request.getInputStream()); - }catch (IOException e){ - throw new RuntimeException(e); - } - } - - public String getBodyString() { - final InputStream inputStream = new ByteArrayInputStream(body); - - return inputStream2String(inputStream); - } - - /** - * 将inputStream里的数据读取出来并转换成字符串 - * - * @param inputStream inputStream - * @return String - */ - private String inputStream2String(InputStream inputStream) { - StringBuilder sb = new StringBuilder(); - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset())); - String line; - while ((line = reader.readLine()) != null) { - sb.append(line); - } + return inputStream2String(request.getInputStream()); } catch (IOException e) { throw new RuntimeException(e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } } - - return sb.toString(); } - @Override - public BufferedReader getReader() throws IOException { - return new BufferedReader(new InputStreamReader(getInputStream())); + private String inputStream2String(ServletInputStream inputStream) { + return new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset())) + .lines() + .collect(Collectors.joining("\n")); } @Override public ServletInputStream getInputStream() throws IOException { - - final ByteArrayInputStream inputStream = new ByteArrayInputStream(body); - return new ServletInputStream() { - @Override - public int read() throws IOException { - return inputStream.read(); - } + private final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); @Override public boolean isFinished() { - return false; + return byteArrayInputStream.available() == 0; } @Override public boolean isReady() { - return false; + return true; } @Override public void setReadListener(ReadListener readListener) { + // No-op + } + + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); } }; } -} \ No newline at end of file + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } +}