求高手解答URLConnection实现远程FTP文件下载,文件名为中文名(如:测试.jpg)时,报错求解?

duxikuan 2012-06-20 02:34:25
URLConnection实现远程FTP文件下载,文件名为中文名(如:测试.jpg)时,报错求解.说明下载英文名文件时是正常的,迄今为止没有发现正确的解决方案.求高手解答
Exception in thread "main" java.util.concurrent.ExecutionException: java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at Downloader.main(Downloader.java:200)
Caused by: java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at Downloader.call(Downloader.java:73)
at Downloader.call(Downloader.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


代码如下:
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* 使用URLConnection下载文件或图片并保存到本地。
*
* @author
*/
public class URLConnectionDownloader {
public static void main(String[] args) throws Exception {
download("ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/无标题.bmp;type=i", "无标题.bmp");
}
/**
* 下载文件到本地
*
* @param urlString
* 被下载的文件地址
* @param filename
* 本地文件名
* @throws Exception
* 各种异常
*/
public static void download(String urlString, String filename) throws Exception {
// 构造URL
URL url = new URL(urlString);
// 打开连接
URLConnection con = url.openConnection();
// 输入流
InputStream is = con.getInputStream();
// 1K的数据缓冲
byte[] bs = new byte[1024];
// 读取到的数据长度
int len;
// 输出的文件流
OutputStream os = new FileOutputStream(filename);
// 开始读取
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
// 完毕,关闭所有链接
os.close();
is.close();
}
}
...全文
958 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Java可以吃吗 2013-11-19
  • 打赏
  • 举报
回复
这个问题是JDK版本的问题,只要ftp的URL访问中有中文的目录或者文件名就不行!转码会出错,升级JDK就不会了!
duxikuan 2012-07-30
  • 打赏
  • 举报
回复
因为我在用serv-u做的FTP服务器,现在有一个办法,是在serv-u的"限制和设置"-"为域配置高级FTP命令设置和行为"-"全局属性"-"高级选项"将"对所有已收发的路径和文件名使用utf-8编码"这一项取消掉,运行上面的代码就可以直接下载中文名字的文件了.但我实际使用的不是serv-u服务器,编码是utf-8,所以我需要在代码里实现,而不是去改服务器的配置,不知道要如何来实现,我试过
new String("无标题".getBytes("iso8859-1"),"utf-8"),但是很奇怪,虽然没有报错,可是下载下来的文件打开一看,图片看不到,1M的文件下载下来只有17k.
如果用new String("无标题".getBytes("gbk"),"utf-8"),则直接报以下错误
Exception in thread "main" sun.net.ftp.FtpProtocolException: 501 Syntax error in parameters or arguments.

at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)
at sun.net.ftp.FtpClient.get(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:35)
at URLConnectionDownloader.main(URLConnectionDownloader.java:17)

请问要如何加以处理,谢谢
duxikuan 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
肯定是乱码了。把中文明编码成Unicode或者把字符集换成和系统一样的
[/Quote]


上面有完整的代码,大家都可以运行下试试.
meichen8050753 2012-07-24
  • 打赏
  • 举报
回复
肯定是乱码了。把中文明编码成Unicode或者把字符集换成和系统一样的
duxikuan 2012-07-24
  • 打赏
  • 举报
回复
还有高招吗?望高手指点,多谢
duxikuan 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
UTF-8

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%E6%97%A0%E6%A0%87%E9%A2%98.bmp;type=i
[/Quote]

这个也已经测试过,报错如下:

Exception in thread "main" java.io.FileNotFoundException: tmp/ftp/SDdisk/dcim/100media/无标题.bmp
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:33)
at URLConnectionDownloader.main(URLConnectionDownloader.java:15)
duxikuan 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
对中文路径进行URLEncoder编码试试

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%CE%DE%B1%EA%CC%
E2.bmp;type=i
[/Quote]

这个已经测试过,报错如下:
Exception in thread "main" java.lang.IllegalArgumentException
at sun.net.www.ParseUtil.decode(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.decodePath(Unknown Source)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(Unknown Source)
at URLConnectionDownloader.download(URLConnectionDownloader.java:33)
at URLConnectionDownloader.main(URLConnectionDownloader.java:15)
RDroid 2012-07-13
  • 打赏
  • 举报
回复
UTF-8

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%E6%97%A0%E6%A0%87%E9%A2%98.bmp;type=i
RDroid 2012-07-13
  • 打赏
  • 举报
回复
对中文路径进行URLEncoder编码试试

ftp://root:root@192.168.201.217:21/tmp/ftp/SDdisk/dcim/100media/%CE%DE%B1%EA%CC%
E2.bmp;type=i

duxikuan 2012-07-13
  • 打赏
  • 举报
回复
有没有人帮解答下啊,多谢
duxikuan 2012-07-05
  • 打赏
  • 举报
回复
没有高手能解决的了吗?一个高手挑战下
duxikuan 2012-06-28
  • 打赏
  • 举报
回复
这个试过不行的,代码已经附在最上面,求高手解答,最好能在上面的代码上进行修改,程序是正确的,只是只能下载英文不能下载中文名文件.
brightyq 2012-06-21
  • 打赏
  • 举报
回复
可能字符集的问题,看一下download方法,传过来的参数filename是什么东东,是不是你要的。
如果不是,就要用字符集转一下。
默认可能是iso8859-1
String fn = new String(filename.getBytes("iso8859-1"), "utf-8");
试试
wangqi0614 2012-06-21
  • 打赏
  • 举报
回复
一样啊,高手们快来解决吧
duxikuan 2012-06-20
  • 打赏
  • 举报
回复
期待高手出现....
duxikuan 2012-06-20
  • 打赏
  • 举报
回复
Serv-U建立的一个FTP
qybao 2012-06-20
  • 打赏
  • 举报
回复
这类问题肯定又是编码问题了?

远程端的系统是什么系统?用的是什么字符集?

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧