FTPサーバーからダウンロードするとファイルが破損する

FTPサーバーからダウンロードするとファイルが破損する

現在、FTPサーバーからファイルをダウンロードする際に問題が発生しています。ファイルが破損してしまいます。この問題の概要については、このSOの質問(問題は Qt ベースのソフトウェアにあると考えていましたが、今ではサーバーにあると確信しています)。

状況はこうです。8つのファイルをFTPサーバーにコピーし、後でQtベースのソフトウェアとQNetworkAccessManagerを使用してダウンロードしたいのです。そうしようとしたところ、すべての方法8つのファイルのうち3つが(ハッシュ検証とファイルサイズの両方を使用して)同じように(同じ誤ったファイルサイズで)破損しています。問題は私のソフトウェアではありません。MozillaとChromeの両方を使用してファイルをダウンロードすると、ちょうど同じエラー。全体のプロセスは次のとおりです。

  1. Linux Ubuntu フォルダーに 8 つのファイルがあります。ファイル サイズは問題ありません。
  2. 8 つのファイルが Windows 7 フォルダーに転送されます。
  3. ファイルはFileZillaを使用してFTPサーバーに送信されます。完了すると、FileZillaは正しい8 つのファイルのそれぞれのサイズ。
  4. ファイルは、Linux Ubuntu と Windows の両方で、ブラウザーと QNetworkAccessManager を使用した Qt ベースのアプリの両方を使用してダウンロードされます。Windows では、ファイルは FileZilla を使用してダウンロードされることもあります。
  5. 同じ 3 つのファイルが破損しています - サイズの違いによって確認されています。

SOの質問でこの問題を議論した後、問題はサーバー側にある可能性があると示唆されました。私はウェブで調査したところ、これこれそしてこれ提案としては、FileZilla による異なるサイズ計算 (ほとんどの場合、Windows と Linux のサイズ計算を使用しているため困難) と「バイナリまたは ASCII 転送の問題」が挙げられます。

2 番目に関しても、問題のある 3 つのファイルのうち 2 つはソフトウェアで、もう 1 つはバイナリ ファイルですが、4 つ目のファイルもバイナリであり、まったく問題がないため、これが事実であるとは信じがたいです。(他の 3 つのファイルは圧縮された .tar.gz であり、これもバイナリであると思われますが、正しくダウンロードされています)

しかし、もしそうだったとしたら、ダウンロードには 2 つの方法のうち 1 つを指定する必要があります。では、ブラウザ経由でダウンロードする場合と QNetworkAccessManager 経由でダウンロードする場合の両方でこれを実行するにはどうすればよいですか?

そうでない場合はどうなるのでしょうか。その場合、何が起きるのでしょうか。

答え1

さて、どうやら私たちは問題を見つけることができたようです。結局のところ、それは ASCII かバイナリかという問題でした。

問題が最初に発生したとき、私たちは転送モードを「自動」にして、FileZilla 経由で FTP サーバーにファイルを送信していました。FileZilla でダウンロードするときも転送は「自動」に設定されていたため、問題が発生しました。ブラウザーと Qt の QNetworkAccessManager で使用される転送モードは不明で、どちらも問題が返されました。

そこで私のチームは、バイナリを使用して FileZilla でダウンロードをテストしましたが、失敗しました。次に、ASCII を使用してダウンロードしたところ、成功しました。そこで今度は、サーバー内のファイルを削除し、問題のあるファイルの 1 つを ASCII でアップロードし、同じく ASCII を使用して FileZilla でダウンロードしたところ、成功しました。次に、バイナリを使用してアップロードし、FileZilla を使用してバイナリを使用してダウンロードしたところ、成功しました。しかし、Qt ベースのアプリでダウンロードすると、失敗しました。そこで、QNetworkAcessManager は ASCII を使用してダウンロードすると推測しました。つまり、バイナリとしてダウンロードするように再設定するか、ASCII を使用して FTP サーバーにファイルをアップロードする必要があります。この後者のオプションではファイル サイズの計算時に問題が発生するため、可能であれば最初の解決策を採用します (ブラウザーでのダウンロードも成功しましたが、これはバイナリで実行しているようです)。

つまり、QNetworkAccessManager は ASCII を使用してダウンロードするようです。したがって、後で QNetworkAcessManager を使用してダウンロードする予定の場合は、FTP サーバーにアップロードされるすべてのファイルを ASCII で実行する必要があります。

編集: 私のミスです。QNetworkAccessManager は実際には ASCII ではなくバイナリを使用してダウンロードします。もちろん、このため、問題を解決する方法についての私の解釈を再評価する必要がありますが、ASCII またはバイナリがすべての混乱の原因であることは依然として明らかです。

編集 2: 問題は解決しました。基本的に、データが FTP サーバーにバイナリとしてアップロードされるようにする必要があります。QNAM はバイナリとしてダウンロードするため、データは問題ないはずです。面白いことに、これは Linux でのみ機能するようです。Qt ベースのダウンロード アプリを Windows で実行すると、問題は解決しません。

編集 3: Windows の問題が解決しました。これは構成の問題であり、この問題とは関係ありませんでした。

関連情報