3

FTPサーバー内にデータをアップロードする必要があります。

内部にファイルをアップロードし、FTPですべてが機能する方法に関するstackoverflowの投稿に従ってください。

今、私は自分のアップロードを改善しようとしています。

代わりに、データを収集し、それらをファイルに書き込んでから、FTP内にファイルをアップロードします。データを収集し、ローカルファイルを作成せずにアップロードします。

これを達成するために、私は次のことを行います:

string uri = "ftp://" + ftpServerIp + "/" + fileToUpload.Name;
System.Net.FtpWebRequest reqFTP;
// Create FtpWebRequest object from the Uri provided
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIp + "/" + fileToUpload.Name));
// Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
// By default KeepAlive is true, where the control connection is not closed after a command is executed.
reqFTP.KeepAlive = false;
// Specify the command to be executed.
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// Specify the data transfer type.
reqFTP.UseBinary = true;
byte[] messageContent = Encoding.ASCII.GetBytes(message);
// Notify the server about the size of the uploaded file
reqFTP.ContentLength = messageContent.Length;
int buffLength = 2048;
// Stream to which the file to be upload is written
Stream strm = reqFTP.GetRequestStream();
// Write Content from the file stream to the FTP Upload Stream
int total_bytes = (int)messageContent.Length;
while (total_bytes > 0)
{
    strm.Write(messageContent, 0, buffLength);
    total_bytes = total_bytes - buffLength;
}
strm.Close();

ここで何が起こるかは次のとおりです。

  1. クライアントがサーバーに接続しているのが見えます
  2. ファイルが作成されます
  3. データは転送されません
  4. ある時点でスレッドが終了し、接続が閉じられます
  5. アップロードしたファイルが空であることを確認した場合。

転送したいデータは文字列型です。そのため、byte [] messageContent = Encoding.ASCII.GetBytes(message);を実行します。

私は何が間違っているのですか?

さらに、日付をASCII.GetBytesでエンコードした場合、リモートサーバーにTEXTファイルまたはいくつかのバイトを含むファイルがありますか?

提案ありがとうございます

4

2 に答える 2

5

このコードで見られる問題の1つは、反復ごとに同じバイトをサーバーに書き込んでいることです。

while (total_bytes > 0)
{
    strm.Write(messageContent, 0, buffLength); 
    total_bytes = total_bytes - buffLength;
}

次のようにして、オフセット位置を変更する必要があります。

while (total_bytes < messageContent.Length)
{
    strm.Write(messageContent, total_bytes , bufferLength);
    total_bytes += bufferLength;
}
于 2012-05-07T08:58:32.407 に答える
2

自分が持っているよりも多くのデータを書き込もうとしています。一度に2048バイトのブロックをコードで書き込み、データが少ない場合はwrite、配列の外側にあるバイトにアクセスしようとするようにメソッドに指示しますが、もちろんアクセスしません。

データを書き込む必要があるのは次のとおりです。

Stream strm = reqFTP.GetRequestStream();
strm.Write(messageContent, 0, messageContent.Length);
strm.Close();

データをチャンクで書き込む必要がある場合は、配列内のオフセットを追跡する必要があります。

int buffLength = 2048;
int offset = 0;

Stream strm = reqFTP.GetRequestStream();

int total_bytes = (int)messageContent.Length;
while (total_bytes > 0) {

  int len = Math.Min(buffLength, total_bytes);
  strm.Write(messageContent, offset, len);
  total_bytes -= len;
  offset += len;
}

strm.Close();
于 2012-05-07T09:03:33.497 に答える