广州市门户网站建设,广州安全教育平台应用,个人养老金制度来了,百度云网站空间建设做1个接口#xff0c;处理前端请求图片跨域的问题。由于前端拿图片的时候#xff0c;有跨域问题#xff0c;所以让后台先拿到图片#xff0c;然后再写给前台。本来下面的代码没什么太大的问题#xff0c;但是如果前台请求的图片一多#xff08;1个页面中有很多图片#…做1个接口处理前端请求图片跨域的问题。由于前端拿图片的时候有跨域问题所以让后台先拿到图片然后再写给前台。本来下面的代码没什么太大的问题但是如果前台请求的图片一多1个页面中有很多图片有些请求就会报错java.io.IOException: Broken pipe…
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import org.springframework.web.context.ServletContextAware;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;Slf4j
Service
public class FileServiceImpl implements IFileService {Autowiredprivate HttpServletResponse response;Overridepublic void getImg(String imageUrl) {URL target null;try {target new URL(imageUrl);URLConnection urlConnection target.openConnection();//获取输入流InputStream inputStream urlConnection.getInputStream();byte[] bytes StreamUtils.copyToByteArray(inputStream);StreamUtils.copy(bytes, response.getOutputStream());response.getOutputStream().close();} catch (Exception e) {log.error(获取图片失败, 图片url: {}, 异常信息: {}, imageUrl, e);}}}
因此需要加上Content-Length响应头由于没有告知客户端响应是否写完当前返回的数据响应体大小客户端就可能随时主动断开连接
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import org.springframework.web.context.ServletContextAware;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;Slf4j
Service
public class FileServiceImpl implements IFileService, ServletContextAware {Autowiredprivate HttpServletResponse response;private ServletContext servletContext;Overridepublic void getImg(String imageUrl) {URL target null;try {target new URL(imageUrl);URLConnection urlConnection target.openConnection();response.setHeader(Content-Type,servletContext.getMimeType(imageUrl));//获取输入流InputStream inputStream urlConnection.getInputStream();byte[] bytes StreamUtils.copyToByteArray(inputStream);// 必须告诉浏览器客户端当前数据的大小, 否则客户端可能会断开连接, 导致broke pipe异常response.setContentLength(bytes.length);StreamUtils.copy(bytes, response.getOutputStream());response.getOutputStream().close();} catch (Exception e) {log.error(获取图片失败, 图片url: {}, 异常信息: {}, imageUrl, e);}}Overridepublic void setServletContext(ServletContext servletContext) {this.servletContext servletContext;}
}