2025年java ftp上传图片失贞——ASCII 和BINARY模式区别

java ftp上传图片失贞——ASCII 和BINARY模式区别最近搞 linux ftp 测试的时候发现一个奇怪的问题 windows 上显示正常的图片 上传到 linux ftp 上之后 图片严重失贞 如下图所示 上传所用 java 代码如下 package com cpsdna laso util import java io

大家好,我是讯享网,很高兴认识大家。

最近搞linux ftp,测试的时候发现一个奇怪的问题,windows上显示正常的图片,上传到linux ftp上之后,图片严重失贞。如下图所示:



讯享网

 


 

上传所用java代码如下:

package com.cpsdna.laso.util; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.*; import com.cpsdna.laso.webapp.dict.Util; import com.xinhi.pub.PubUtils; public class FTPTest { private static String host="192.168.1.94"; private static int port=21; private static String username="ftpuser"; private static String password=""; public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); try{ ftpClient.connect(host, port); ftpClient.login(username, password); ftpClient.changeWorkingDirectory("/hello/"); //列出文件列表 FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if(ff.isDirectory()){ System.out.print("Directory "); }else if(ff.isFile()){ System.out.print("File "); } System.out.println(new String(ff.getName().getBytes("iso8859-1"), "UTF-8")); } String baseDir="F:\\file\\"; File srcFile = new File(baseDir + "rerew.jpg"); String filename="rerew.jpg"; int lastIndex = filename.lastIndexOf("."); filename = filename.substring(0, lastIndex) + "_" + System.currentTimeMillis() + filename.substring(lastIndex); InputStream input = new FileInputStream(srcFile); //把file直接转换成流,然后直接上传 ftpClient.storeFile(new String(filename.getBytes("GBK"), "iso-8859-1"), input); }catch(Exception e){ }finally{ if (ftpClient != null) { try { ftpClient.logout(); } catch (IOException ioe) { Log.error("error", ioe); } } if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { Log.error("error", ioe); } } } } } 

讯享网

问题出在哪里呢?查看其它程序中的代码,发现,少了这一句:

讯享网ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

 也就是上传文件传输类型问题设置。加上之后果然就ok了。

 

可为什么呢?于是Google,发现里面居然有很有趣的故事,分享给大家:

“回车和换行关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

 

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

 

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

 

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

 

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打 开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。 

Dos和windows采用回车+换行CR/LF表示下一行,

而UNIX/Linux采用换行符LF表示下一行,

苹果机(MAC OS系统)则采用回车符CR表示下一行.

ASCII 模式和BINARY模式的区别是回车换行的处理,binary模式不对数据进行任何处理,asci模式将回车换行转换为本机的回车字符,比如Unix下是\n,Windows下是\r\n,Mac下是\r”

 


所以,FTP可用多种格式传输文件,通常由系统决定,大多数系统(包括UNIX系统)只有两种模式:文本模式和二进制模式。文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。

 

  一般来说: 如果你用错误的模式传输你的图片,你将会无法看到图片,看到的会是乱码。 如果你用错误模式上传CGI脚本,那么就将无法运行你的脚本,会看到类似Server 500 Error的出错信息。

 

  所以你必须使用正确的模式,图片和执行文件必须用BINARY模式,CGI脚本和普通HTML文件用ASCII模式上传.

 

  ASCII 和BINARY模式区别:

 

  用HTML 和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错。

 

  BINARY模式用来传送可执行文件,压缩文件,和图片文件。

 

  如果你用ASCII模式传,会显示一堆乱码,你必须重新用BINARY模式传。

 

小讯
上一篇 2025-01-08 20:26
下一篇 2025-04-04 17:48

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73195.html