`
yong3773
  • 浏览: 32517 次
社区版块
存档分类
最新评论

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

阅读更多

最近搞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="123456";
	
	

	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\nMac下是\r

 


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

 

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

 

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

 

  ASCII BINARY模式区别:

 

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

 

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

 

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

 


 

  • 大小: 185.5 KB
  • 大小: 334.8 KB
0
0
分享到:
评论

相关推荐

    ftp的ASCII模式和Binary模式的区别

    ftp的ASCII模式和Binary模式的区别

    matlab读取contrade文件然后画出各通道波形读取ASCII与binary

    matlab读取contrade文件然后画出各通道波形读取ASCII与binary 文本与二进制都支持

    Java实现简单在线播放器——支持优酷和土豆

    Java实现简单在线播放器——支持优酷和土豆 。原理很简单。纠结的是要知道土豆跟优酷是的视频播放需要哪些参数。更多请参看http://blog.csdn.net/cannel_2020/article/details/7953257 或 者...

    Java(TM) Platform SE binary 7.70U I586完整版

    Java(TM) Platform SE binary 7.70U I586完整版 Java(TM) Platform SE binary 7.70U I586完整版,JAVA开发必备的SUN公司软件。

    unix的ftp使用详解

    FTP是File Transfer ... FTP传输文件时,支持不同的传输模式,有ascii和binary模式。在传输可执行文件和数据文件时最好使用binary模式。  使用FTP的时候,必须拥有远端计算机的帐号和密码,才可进行文件传输。

    FTP客户端程序--VC

    自己写的一个网络课程设计-FTP客户端程序,实现本地文件浏览和服务器端文件浏览、上传和下载、用户FTP和匿名FTP登陆、ASCII和Binary传输模式、Port和Passive连接模式,包括源程序和设计报告,有详细代码解释

    JAVA程序中FTP的连接以及上传文件

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io....

    BinaryTree.java

    二叉树的实现代码,我的博客“Java——二叉树的基础实现”的代码。 https://blog.csdn.net/J_fla/article/details/103236673

    ftp可登录但是无法下载,上传问题解决

    构建了一个ftp服务器,通过命令ftp可登录,登录后,无法下载,上传,ls也无法执行。 通过 passive 开启和关闭 PASV模式,再ls 也是同样的问题, # 主动模式 $ pftp -v -A -d 211.159.185.xxx Connected to 211...

    TXT文件转DAT文件(ASCII转BINARY)

    可以实现把文本文件转为二进制加密文件,且保证写入前后数据不发生变化

    java-二叉树binaryTree

    2.binaryTree树 标准的二叉树。 实现了各种算法,增删查改等等

    Java Binary Tree Addition

    BinaryAddition. In briefly, it had been done with java.

    weixin-java-cp-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-cp-2.8.0.jar; 赠送原API文档:weixin-java-cp-2.8.0-javadoc.jar; 赠送源代码:weixin-java-cp-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-cp-2.8.0.pom; 包含翻译后的API...

    weixin-java-common-3.5.0-API文档-中文版.zip

    赠送jar包:weixin-java-common-3.5.0.jar; 赠送原API文档:weixin-java-common-3.5.0-javadoc.jar; 赠送源代码:weixin-java-common-3.5.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-common-3.5.0.pom;...

    BinarySearch.java

    实现折半查找的程序 希望大家功能学习,共同进步

    weixin-java-mp-3.5.0-API文档-中英对照版.zip

    赠送jar包:weixin-java-mp-3.5.0.jar; 赠送原API文档:weixin-java-mp-3.5.0-javadoc.jar; 赠送源代码:weixin-java-mp-3.5.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-mp-3.5.0.pom; 包含翻译后的API...

    weixin-java-pay-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-pay-2.8.0.jar; 赠送原API文档:weixin-java-pay-2.8.0-javadoc.jar; 赠送源代码:weixin-java-pay-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-pay-2.8.0.pom; 包含翻译后...

    weixin-java-miniapp-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-miniapp-2.8.0.jar; 赠送原API文档:weixin-java-miniapp-2.8.0-javadoc.jar; 赠送源代码:weixin-java-miniapp-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-miniapp-2.8.0....

    weixin-java-mp-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-mp-2.8.0.jar; 赠送原API文档:weixin-java-mp-2.8.0-javadoc.jar; 赠送源代码:weixin-java-mp-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-mp-2.8.0.pom; 包含翻译后的API...

Global site tag (gtag.js) - Google Analytics