解决ImageIO.read中文路径问题

729 阅读1分钟

问题:ImageIO.read 无法读取中文路径

String path = "http://127.0.0.1:8080/你过来呀/2023-01-30/533701000000090028/我过来了呀haha.jpg";
URL u=new URL(path);
BufferedImage coverImg = ImageIO.read(u);

上面代码会报下面错误:

:javax.imageio.IIOException: Can't get input stream from URL!
	at javax.imageio.ImageIO.read(Unknown Source)
	at com.zteits.atms.common.util.GraphicsUtil.comCarImage(GraphicsUtil.java:104)
	at com.zteits.atms.common.util.GraphicsUtil.createQuJianXianShiBmp(GraphicsUtil.java:174)
	at com.zteits.atms.modules.ill.service.impl.QuJianXianShiImpl.sendQuJianXianShiToLed(QuJianXianShiImpl.java:86)
	at com.zteits.atms.modules.ill.service.impl.QuJianXianShiImpl$$FastClassBySpringCGLIB$$85a2252e.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:56)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
	at com.zteits.atms.modules.ill.service.impl.QuJianXianShiImpl$$EnhancerBySpringCGLIB$$56886768.sendQuJianXianShiToLed(<generated>)
	at com.zteits.atms.modules.job.ill.AutoSendLEDJob.execute(AutoSendLEDJob.java:30)
	at com.xxl.job.core.thread.JobThread.run(JobThread.java:152)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://127.0.0.1:8080/你过来呀/2023-01-30/533701000000090028/我过来了呀haha.jpg
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at java.net.URL.openStream(Unknown Source)
	... 14 more

解决方案:对路径中文部分路径进行编码

// 对中文路径的中文部分进行编码
public static String encodeChinese(String url) throws UnsupportedEncodingException {
    String resultURL = "";
    //遍历字符串
    for (int i = 0; i < url.length(); i++) {
        char charAt = url.charAt(i);
        //只对汉字处理
        if (isChineseChar(charAt)) {
            String encode = URLEncoder.encode(charAt+"","UTF-8");
            resultURL+=encode;
        }else {
            resultURL+=charAt;
        }
    }
    return resultURL;
}
String coverFilePath = "http://127.0.0.1:8080/你过来呀/2023-01-30/533701000000090028/我过来了呀haha.jpg";
String path = encodeChinese(coverFilePath);
URL u = new URL(path);
BufferedImage coverImg = ImageIO.read(u);
image.createGraphics().drawImage(coverImg, 0, 210, 320, 180, null);