欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FtpURLConnection 图片下载编码问题

程序员文章站 2022-05-12 21:08:11
...
写道
问题:
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编码

 
FtpURLConnection 图片下载编码问题
            
    
    博客分类: Java FtpURLConnectionftpFileNotFoundException 
 

写道
为什么Web项目中,在执行下载前通过System.setProperties("file.encoding","UTF-8")设置編码,仍然提示FileNotFoundException即编码问影响,设置不起作用?

JVM 参数存在缓存,JVM启动时已加载至缓存,FtpURLConnection从缓存获取,后续通过System改变不启作用,Myeclipse/eclipse:windows-->preferences-->installed JREs-->Edit

 
FtpURLConnection 图片下载编码问题
            
    
    博客分类: Java FtpURLConnectionftpFileNotFoundException 
 

 

写道
Tomcat 启动时或运行Jar时设置-Dfile.encoding=UTF-8
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;
}

 

 

  • FtpURLConnection 图片下载编码问题
            
    
    博客分类: Java FtpURLConnectionftpFileNotFoundException 
  • 大小: 77.5 KB
  • FtpURLConnection 图片下载编码问题
            
    
    博客分类: Java FtpURLConnectionftpFileNotFoundException 
  • 大小: 65.7 KB