31

クライアントの ftp サイトの 1 つにファイルをアップロードする小さな Windows フォーム アプリケーションを作成しました。しかし、私が抱えている問題は、ローカル マシンでこのアプリケーションを実行すると、ファイルが正常にアップロードされることです。しかし、このプログラムをサーバーで実行すると、次のエラー メッセージが表示されます。

リモート サーバーがエラーを返しました: (550) ファイルが利用できません (たとえば、ファイルが見つからない、ファイルにアクセスできない)、この行 'objFTPRequest.GetRequestStream();'。

理由を知っている人はいますか?ファイアウォールなどを設定する必要がありますか? これが私のコードです。

FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;

// Create FtpWebRequest object 
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));

// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

// By default KeepAlive is true, where the control connection is 
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;

// Set the data transfer type.
objFTPRequest.UseBinary = true;

// Set content length
objFTPRequest.ContentLength = objFile.Length;

// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;

// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];

// Opens a file to read
FileStream objFileStream = objFile.OpenRead();


// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();

int len = 0;

while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
    // Write file Content 
    objStream.Write(objBuffer, 0, len);

}

            objStream.Close();
            objFileStream.Close();
4

15 に答える 15

26

これを試してください: ftp://xxx.xxx.xx.xx:21//path/filename

サーバーアドレスの後の「//」は、ルートディレクトリから始まります。ftp://xxx.xxx.xx.xx:21/path/filenameを持っていたにもかかわらず 、正しいディレクトリに移動しませんでした。

于 2014-12-15T15:10:55.093 に答える
7

私は同じ問題に遭遇しました。これが私がしたことです:

  1. OSに書き込み権限があることを確認してください。ftp フォルダーを見つけます => 右クリック => プロパティ => セキュリティ、次に何をすべきかを知る必要があります
  2. ftp サーバーをチェックして、ログインしたユーザーに書き込み権を開きます。IIS を開く => ftp サイトをクリック => ftp Authorization Rules => 許可ルールを追加 => ユーザーまたはグループを選択して権限を設定
  3. ftp サーバーのディレクトリを確認し、項目 2 で同じことを行います。

設定する権利を示すために 4 つの画像を使用できます。 ここに画像の説明を入力

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

于 2013-07-09T17:07:57.333 に答える
4

It could be more simple.

I facing similar issue and i tried all the suggested solution but no one work. I'm figure out in simple manner like this one : take a look

Wrong code at my end

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)

Change it in this simple one :

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)

then procced with fill request and send to server :)

That's all.

Make sure that all permission on server work fine and u're using right credential.

于 2014-04-03T20:31:50.183 に答える
1

解決策を見つけました。問題は、ftp ユーザーの現在の作業ディレクトリです。ftp:///path/test.txt のような URL を入力すると、作業ディレクトリへの相対パスとして使用されます。たとえば、CWD が /test の場合、使用されるパスは /test/path/test.txt です。絶対パスを使用する場合は、ftp:////path/test.txt のように URL を入力する必要があります。次に、ファイルは例外なく /path/test.txt フォルダーにアップロードされます。

于 2018-10-01T07:16:12.903 に答える
0

この問題を解決するには、System.Net.FtpWebRequest コマンドを強制的に .Net Framework 2.0/3.5 で使用されていた古い動作に戻し、実際のコマンドを発行する前に追加の CWD コマンドを発行する必要があります。 .

これを行うには、System.Net.FtpWebRequest クラスのインスタンスが呼び出される前に、次のコードを配置する必要があります。以下のコードは、アプリケーション ドメイン全体の設定を変更するため、一度だけ呼び出す必要があります。

private static void SetMethodRequiresCWD()
{
        Type requestType = typeof(FtpWebRequest);
        FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
        Type methodInfoType = methodInfoField.FieldType;


        FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
        Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);

        FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);

        int MustChangeWorkingDirectoryToPath = 0x100;
        foreach (object knownMethod in knownMethodsArray)
        {
            int flags = (int)flagsField.GetValue(knownMethod);
            flags |= MustChangeWorkingDirectoryToPath;
            flagsField.SetValue(knownMethod, flags);
        }
 }

http://support.microsoft.com/kb/2134299

于 2013-11-06T21:44:25.397 に答える
0

対象フォルダ「outbox」が存在することを確認してください。それがエラー550の問題でした。

アップロードする前に、ターゲットディレクトリ「出力」を作成するだけです。

try
        {
            WebRequest request = WebRequest.Create("ftp://" + ftpServerIP + "/outbox");
            request.Credentials = new NetworkCredential("user", "password");
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            using (var resp = (FtpWebResponse)request.GetResponse())
            {
                Console.WriteLine(resp.StatusCode);
            }
        }
        catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                response.Close();
                //already exists
            }
            else
            {
                response.Close();
                //doesn't exists = it's another exception
            }
        }
于 2017-07-31T12:30:21.693 に答える
-1

リングに帽子を投げるだけで、同じエラーが発生しました。FTPRequest が同じコンピューター (同じ IP) 上の FTP サービスからファイルを要求していた場合。リクエストではマシンの IP アドレスを使用していましたが、それを 127.0.0.1 に変更すると機能しました。興味深いことに、それ自体からではなく、他の IP アドレスからの要求が処理され、ファイルがダウンロードされていました。

それが誰かを助けたことを願っています。

于 2015-11-16T01:50:57.917 に答える
-1

私は同じ問題を抱えていました.ftpuriとユーザー名のパスと比較すると解決しました.ftpアクセスを作成するときに/ディレクトリ名としてパスを選択しました.

ディレクトリ名を含めるとftpuriでエラーが発生し、ディレクトリ名を削除すると解決されました。

エラーのあるftpuri

" ftp://www.example.com/Project/yourfilename.ds "

ftpuriが解決しました

" ftp://www.example.com/yourfilename.ds "

ftpアクセスフォルダ「/Project」

于 2017-01-11T15:56:34.100 に答える
-1

同じ問題が発生したとき、上記のすべてを試してみましたが、1日後、uri用に作成したパスの「/」とフォルダー名の間に空白があることに気付きました

string uri="192.168.1.101/ Sync/Image.jpg";

上記の文字列は

string uri="192.168.1.101/Sync/Image.jpg";

この小さな間違いでも同じエラーがスローされます。「/」とフォルダー/ファイル名の間に空白が含まれている場合、これはファイルの有効なパスではないため、これは有効なエラーです。

于 2016-09-15T09:14:58.720 に答える