0

FTPファイルを実行する次のコードがあります:

    private bool InitFTPTransfer(string filePath)
    {
        Uri ipAddress = new Uri(ddcdao.ddcAddress);

        string ftpAddress = "ftp://10.175.95.11/mnt/flash" +Path.GetFileName(filePath);
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpAddress);
        request.Method = WebRequestMethods.Ftp.UploadFile;

        request.Credentials = new NetworkCredential(Properties.Settings.Default.SysFTPID, Properties.Settings.Default.SysFTPPassword);


        byte[] fileContents = File.ReadAllBytes(filePath);

        request.ContentLength = fileContents.Length;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(fileContents, 0, fileContents.Length);
        requestStream.Close();

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();

        response.Close();
        return true;
    }

ファイルは問題なく転送されますが、ファイルは指定されたディレクトリ (/mnt/flash) ではなく、ルートに配置されます。

ftp アドレスでディレクトリを指定すると宛先が適切に設定されるはずであるという印象を受けましたが、これは組み込み Linux には当てはまらない可能性があります。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

パスは正しいようです。でも:

  1. 最初にファイル名を URL エンコードして、無効な文字をエスケープします。
  2. コードには/、フォルダーとファイル名の間のスラッシュ ( ) がありません。これにより、パスが無効になり、ルート フォルダーに書き込まれる可能性があります。
  3. using または try...finally ブロックを使用して、例外がスローされた場合にさまざまなストリームを閉じます。
  4. ファイル全体を読み込む代わりに、 stream.CopyTo (ストリームの内容を別のストリームにコピーするにはどうすればよいですか? を参照) を使用します。ファイルが特に大きい場合、これは問題を引き起こす可能性があります。

問題は、FTP サーバーの構成側にある可能性があります。FTP サーバーは、ファイル システムのルート フォルダーをルート フォルダーとして提供しているように見えますが、これは不適切な方法です。FTP サーバーは、ファイルのダウンロード元またはアップロード先のフォルダーのみを提供する必要があります。ただし、これは、使用している組み込み Linux の構成の機能である可能性があります。

于 2012-09-06T06:25:48.010 に答える