我需要将文件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();
}
答案 0 :(得分:27)
虽然回复旧帖只是认为它可能对某人有帮助。
创建ftp url时,请确保不包含该登录的默认目录。
例如这是我指定的路径,我得到了异常553 FileName不允许异常
ftp://myftpip/gold/central_p2/inbound/article_list/jobs/abc.txt
我使用的登录有默认目录gold / central_p2.so提供的url变得无效,因为它试图在默认目录中找到整个路径。我相应地修改了我的url字符串并且能够摆脱异常。
我修改的网址看起来像
ftp://myftpip/inbound/article_list/jobs/abc.txt
谢谢,
Sab的
答案 1 :(得分:7)
这可能有助于Linux FTP服务器。
因此,与IIS不同的Linux FTP服务器没有通用的FTP根目录。相反,当您使用某些用户的凭据登录到FTP服务器时,将使用此用户的根目录。因此,FTP目录层次结构从/ root /用于root用户,从/ home / username用于其他用户。
因此,如果您需要查询与用户帐户主目录无关的文件,但相对于文件系统根目录,请添加额外/后服务器名称。生成的URL将如下所示:
ftp://servername.net//var/lalala
答案 2 :(得分:2)
您必须小心使用名称和路径:
string FTP_Server = @"ftp://ftp.computersoft.com//JohnSmith/";
string myFile="text1.txt";
string myDir=@"D:/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 强>
答案 3 :(得分:2)
您的目录有访问限制 删除您的目录,然后使用以下代码重新创建:
//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())
{
}
答案 4 :(得分:1)
前段时间我看到类似的内容,事实证明我正在尝试连接到使用Active Directory保护的内部iis ftp服务器。
在我的网络凭据中,我使用的是新的NetworkCredential(@“domain \ user”,“password”);那是失败的。切换到新的NetworkCredential(“用户”,“密码”,“域”);为我工作。
答案 5 :(得分:1)
我希望这对某人有帮助
如果您使用的是LINUX服务器,请从以下位置替换您的请求路径
FtpWebRequest req= (FtpWebRequest)WebRequest.Create(@"ftp://yourdomain.com//yourpath/" + filename);
到
FtpWebRequest req= (FtpWebRequest)WebRequest.Create(@"ftp://yourdomain.com//public_html/folderpath/" + filename);
文件夹路径就是您在服务器中看到的样子(例如:cpanel)
答案 6 :(得分:0)
虽然它是一篇较旧的帖子,但我认为分享我的经验会很好。我遇到了同样的问题,但我自己解决了。这个问题的主要原因是路径错误(如果你的权限是正确的),当你的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
答案 7 :(得分:0)
此错误的另一个原因可能是FTP服务器区分大小写。这对我来说很有帮助。
答案 8 :(得分:0)
当我尝试以编程方式写入FTP站点的根目录时出现此问题。当我手动重复操作时,FTP会自动将我重新路由到子目录并完成写操作。然后我更改了我的代码,使目标文件名前缀为子目录,操作成功。
答案 9 :(得分:0)
地雷就像文件名冲突一样简单。先前的文件尚未发送到存档文件夹,因此我们尝试再次发送它。得到了553,因为它不会覆盖现有文件。
答案 10 :(得分:0)
首先检查远程服务器上的磁盘空间。 我遇到了同样的问题,发现这是因为我尝试上传文件的远程服务器在分区或文件系统上的磁盘空间不足。
答案 11 :(得分:0)
与谁有关...
我被这个问题困扰了很长时间。 我试图像这样将文件上传到我的网络服务器上:
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create($@"ftp://order.mydomain.com//uploads/{FileName}");
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create($@"ftp://www.mydomain.com//order.mydomain.com//uploads/{FileName}");
它终于奏效了。