FtpURLConnection 图片下载编码问题
写道
问题:
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;
}