web-dev-qa-db-ja.com

FTPに接続できません:(553)ファイル名は許可されていません

ファイルをディレクトリにFTPで転送する必要があります。 .Netでは、接続を作成するために宛先フォルダーのファイルを使用する必要があるため、FTPを使用してサーバーにBlank.datを手動で配置します。アクセス(ls -l)を確認したところ、-rw-r--r--です。しかし、FTPフォルダーに接続しようとすると、サーバーから「リモートサーバーがエラーを返しました:(553)ファイル名が許可されていません」というメッセージが表示されます。私が行った調査によると、これはアクセス許可の問題が原因である可能性がありますが、私が言ったように、ファイルを表示するアクセス許可があり、フォルダーからlsを実行できます。この問題を引き起こす可能性のある他の理由は何ですか?ファイルを指定せずにフォルダーに接続する方法はありますか?

            byte[] buffer;
            Stream reqStream;
            FileStream stream;
            FtpWebResponse response;
            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(string.Format("ftp://{0}/{1}", SRV, DIR)));
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential(UID, PASS);
            request.UseBinary = true;
            request.Timeout = 60000 * 2;
            for (int fl = 0; fl < files.Length; fl++)
            {
                request.KeepAlive = (files.Length != fl);
                stream = File.OpenRead(Path.Combine(dir, files[fl]));
                reqStream = request.GetRequestStream();
                buffer = new byte[4096 * 2];
                int nRead = 0;
                while ((nRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    reqStream.Write(buffer, 0, nRead);
                }
                stream.Close();
                reqStream.Close();

                response = (FtpWebResponse)request.GetResponse();
                response.Close();
            }
12

古い投稿に返信することは、誰かを助けるかもしれないと思っただけですが。

Ftp URLを作成するときは、そのログインのデフォルトディレクトリが含まれていないことを確認してください。

たとえば、これは私が指定していたパスであり、例外553 FileName not allowedexceptionを取得していました。

ftp://myftpip/gold/central_p2/inbound/article_list/jobs/abc.txt

私が使用したログインのデフォルトディレクトリはgold/central_p2でした。そのため、デフォルトディレクトリでパス全体を見つけようとしていたため、指定されたURLが無効になりました。それに応じてURL文字列を修正し、例外を取り除くことができました。

私の修正されたURLは次のようになりました

ftp://myftpip/inbound/article_list/jobs/abc.txt

ありがとう、

サブ

29
user1131926

これは、LinuxFTPサーバーに役立つ場合があります。

したがって、IISとは異なり、Linux FTPサーバーには共通のFTPルートディレクトリがありません。代わりに、あるユーザーの資格情報でFTPサーバーにログオンすると、このユーザーのルートディレクトリが使用されます。したがって、FTPディレクトリ階層ルートユーザーの場合は/ root /から、その他の場合は/ home/usernameから始まります。

したがって、ユーザーアカウントのホームディレクトリではなく、ファイルシステムのルートに関連するファイルをクエリする必要がある場合は、サーバー名の後に/を追加します。結果のURLは次のようになります。

ftp://servername.net//var/lalala
7
Darth Jurassic

ディレクトリにはアクセス制限があります。
ディレクトリを削除してから、次のコードで再作成してください。

//create folder  
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://mpy1.vvs.ir/Subs/sub2");
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Credentials = new NetworkCredential(username, password);
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true ;
using (var resp = (FtpWebResponse)request.GetResponse())
{

}
2
aliastitan

名前とパスに注意する必要があります。

 string FTP_Server = @"ftp://ftp.computersoft.com//JohnSmith/";
 string myFile="text1.txt";
 string myDir=@"D:/Texts/Temp/";

ftp.computersoft.com/JohnSmithにファイルを送信する場合は、text1.txtd:/ texts/tempにあります

その後

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTP_Server+myFile);
    request.Method = WebRequestMethods.Ftp.UploadFile;                      

    request.Credentials = new NetworkCredential(FTP_User, FTP_Password);    

    StreamReader sourceStream = new StreamReader(TempDir+myFile);                  
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    sourceStream.Close();

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

ある瞬間に目的地として使用することに注意してください

ftp://ftp.computersoft.com//JohnSmith/text1.txt

これには、ディレクトリだけでなく、FTPサーバーの新しいファイル名も含まれます(通常、ハードドライブ上のファイルの名前とは異なる場合があります)

そしてあなたがソースとして使う他の場所で

D:/Texts/Temp/text1.txt

2
RRM

しばらく前にこれに似たものを見ましたが、ActiveDirectoryを使用して保護された内部iisftpサーバーに接続しようとしていたことが判明しました。

私のネットワーク資格情報では、新しいNetworkCredential(@ "domain\user"、 "password");を使用していました。そしてそれは失敗していました。新しいNetworkCredential( "user"、 "password"、 "domain");に切り替えます。私のために働いた。

1
Fen

これが誰かに役立つことを願っています

lINUXサーバーを使用している場合は、リクエストパスを

FtpWebRequest req= (FtpWebRequest)WebRequest.Create(@"ftp://yourdomain.com//yourpath/" + filename);

FtpWebRequest req= (FtpWebRequest)WebRequest.Create(@"ftp://yourdomain.com//public_html/folderpath/" + filename);

フォルダーパスは、サーバーに表示される方法です(例:cpanel)

1
Znaneswar

FTPサイトのルートディレクトリにプログラムで書き込もうとしたときに、この問題が発生しました。手動で操作を繰り返すと、FTPによって自動的にサブディレクトリに再ルーティングされ、書き込み操作が完了しました。次に、コードを変更して、ターゲットファイル名の前にサブディレクトリを付けると、操作は成功しました。

0
CAK2

私のはファイル名の衝突と同じくらい簡単でした。以前のファイルがアーカイブフォルダに送信されていなかったため、もう一度送信しようとしました。既存のファイルを上書きしないため、553を取得しました。

0
Jeffrey Roy

このエラーのもう1つの理由は、FTPサーバーで大文字と小文字が区別されることである可能性があります。それを理解するのに時間がかかりました。

0
Evan Barke

古い投稿ですが、自分の経験を共有するのがいいと思いました。私も同じ問題に直面しましたが、自分で解決しました。この問題の主な2つの理由は、ftpパスが間違っている場合にパスのエラー(権限が正しい場合)が発生することです。あなたの道を見ずに何が悪いのかを言うことは不可能ですが、a. Unlike browser FTP doesn't accept some special characters like ~ b. If you have several user accounts under same IP, do not include username or the Word "home" in path c. Don't forget to include "public_html" in the path (normally you need to access the contents of public_html only) otherwise you may end up in a bottomless pitのことを覚えておく必要があります