FtpURLConnection 图片下载编码问题
程序员文章站
2022-05-12 21:08:11
...
写道
问题:
1)Web项目中下载图片,存在下载不全,丢失部份图片
2)FTP路径存在中文图片名称或中文路径
3)直接运行Main方法可以下载图片,放在Web项目中下载失败,错误异常"FileNotFoundException"
1)Web项目中下载图片,存在下载不全,丢失部份图片
2)FTP路径存在中文图片名称或中文路径
3)直接运行Main方法可以下载图片,放在Web项目中下载失败,错误异常"FileNotFoundException"
写道
为什么直接运行Main方法可以成功下载?
Myeclipse/eclipse 右击类--->Run As-->Run Configuration,查看默认编码,直接运行Main方法,JVM启动时,将类文件默认编码设置-Dfile.encoding=UTF-8(Default VM Arguments)
什么时候设置GBK还是UTF-8,依据是什么?
默认情况FTP服务器所在服务有关,Windowns采用GBK,Linux采用UTF-8编码
Myeclipse/eclipse 右击类--->Run As-->Run Configuration,查看默认编码,直接运行Main方法,JVM启动时,将类文件默认编码设置-Dfile.encoding=UTF-8(Default VM Arguments)
什么时候设置GBK还是UTF-8,依据是什么?
默认情况FTP服务器所在服务有关,Windowns采用GBK,Linux采用UTF-8编码
写道
为什么Web项目中,在执行下载前通过System.setProperties("file.encoding","UTF-8")设置編码,仍然提示FileNotFoundException即编码问影响,设置不起作用?
JVM 参数存在缓存,JVM启动时已加载至缓存,FtpURLConnection从缓存获取,后续通过System改变不启作用,Myeclipse/eclipse:windows-->preferences-->installed JREs-->Edit
JVM 参数存在缓存,JVM启动时已加载至缓存,FtpURLConnection从缓存获取,后续通过System改变不启作用,Myeclipse/eclipse:windows-->preferences-->installed JREs-->Edit
写道
Tomcat 启动时或运行Jar时设置-Dfile.encoding=UTF-8
FtpURLConnection用不好到处是坑,直接改JVM编码来适配FTP服务器,应用存在风险,建议下载图采用第三方工具如,Apache common net,附上FtpURLConnection getInputStream源码
FtpURLConnection用不好到处是坑,直接改JVM编码来适配FTP服务器,应用存在风险,建议下载图采用第三方工具如,Apache common net,附上FtpURLConnection getInputStream源码
public InputStream More ...getInputStream() throws IOException { if (!connected) { connect(); } if (http != null) return http.getInputStream(); if (os != null) throw new IOException("Already opened for output"); if (is != null) { return is; } MessageHeader msgh = new MessageHeader(); try { decodePath(url.getPath()); if (filename == null || type == DIR) { ftp.ascii(); cd(pathname); if (filename == null) is = new FtpInputStream(ftp, ftp.list()); else is = new FtpInputStream(ftp, ftp.nameList(filename)); } else { if (type == ASCII) ftp.ascii(); else ftp.binary(); cd(pathname); is = new FtpInputStream(ftp, ftp.get(filename)); } /* Try to get the size of the file in bytes. If that is successful, then create a MeteredStream. */ try { String response = ftp.getResponseString(); int offset; if ((offset = response.indexOf(" bytes)")) != -1) { int i = offset; int c; while (--i >= 0 && ((c = response.charAt(i)) >= '0' && c <= '9')) ; i = Integer.parseInt(response.substring(i + 1, offset)); msgh.add("content-length", ""+i); if (i > 0) { // Wrap input stream with MeteredStream to ensure read() will always return -1 // at expected length. // Check if URL should be metered boolean meteredInput = ProgressMonitor.getDefault().shouldMeterInput(url, "GET"); ProgressSource pi = null; if (meteredInput) { pi = new ProgressSource(url, "GET", i); pi.beginTracking(); } is = new MeteredStream(is, pi, i); } } } catch (Exception e) { e.printStackTrace(); /* do nothing, since all we were doing was trying to get the size in bytes of the file */ } String type = guessContentTypeFromName(fullpath); if (type == null && is.markSupported()) { type = guessContentTypeFromStream(is); } if (type != null) { msgh.add("content-type", type); } } catch (FileNotFoundException e) { try { cd(fullpath); /* if that worked, then make a directory listing and build an html stream with all the files in the directory */ ftp.ascii(); is = new FtpInputStream(ftp, ftp.list()); msgh.add("content-type", "text/plain"); } catch (IOException ex) { throw new FileNotFoundException(fullpath); } } setProperties(msgh); return is; }
下一篇: 转载的内容如何让搜索引擎收录?