Java

FTPでファイル転送するときはバイナリモードを使おう

FTPでファイル転送する際、転送モードとして「アスキー(ASCII)」か「バイナリ(BINARY)」のどちらかを設定します。

  • アスキーモード:ファイル内の改行コードを自動変換して転送する
  • バイナリモード:ファイルをそのまま転送する

例えば、FTPクライアント側がWindowsで、FTPサーバ側がLinuxの場合、アスキーモードでファイルを転送する際、Windowsの改行コード(CR + LF)とLinuxの改行コード(LF)が自動変換されます。そのため、元のファイルの改行コードがCR + LFだったのに、転送されたファイルはLFになってしまうことになります。バイナリモードの場合、改行コードが変換されることはありません。

アスキーモードで転送する場合、テキストファイルだと改行コードが変わるだけでファイルは開けますが、バイナリファイル(zip形式のファイルなど)だとファイルが壊れて開けなくなります。

基本的にはバイナリモードで転送すべき

昔は、改行コードの違いによりプログラムが動作しなかったことがあったため、テキストファイルの転送にはよくアスキーモードが使われたそうですが、現在は改行コードを意識しなくても動作する作りになっていることがほとんどのため(プログラムもエディタも)、テキストファイルであってもバイナリファイルであっても基本的にバイナリモードでファイル転送すべきです。

JavaでFTPClientを使って転送モードを設定するときは、以下のように設定してやればOKです。

FTPClientの場合、デフォルトがアスキーモードになっているので、バリナリモードに変更するときは忘れないように設定してやりましょう。

転送するファイルの種類を設定します。 FTP.ASCII_FILE_TYPE、FTP.BINARY_FILE_TYPEなどのいずれかである必要があります。ファイルタイプは、タイプを変更する場合にのみ設定する必要があります。 変更後は、再度変更するまで新しいタイプが有効になります。 このメソッドが呼び出されない場合、デフォルトのファイルタイプはFTP.ASCII_FILE_TYPEです。 サーバーのデフォルトはASCII(RFC 959を参照)であると想定されていますが、多くのFTPサーバーのデフォルトはBINARYです。 すべてのサーバーで正しく動作するように、サーバーに接続した後は常に適切なファイルタイプを指定してください。
FTPClient (Apache Commons Net 3.6 API)

参考リンク

-Java

© 2020 Reasonable Code