将文件夹上传到ftp子文件夹会返回错误(550)文件不可用,无法访问

时间:2010-12-06 18:03:35

标签: .net ftpwebrequest

我正在尝试将图片上传到ftp。我需要将它放在由特定名称调用的压缩文件夹中,然后将该文件夹上载到特定目录。每次我尝试,我都会收到错误远程服务器返回错误:(550)文件不可用 当我尝试一次上传一个图像时,此代码工作正常。在这里,我试图上传整个文件夹。我检查了uri(我从调试中复制了它)然后就好了。我有不同的方式来上传文件夹吗?我认为这是一个写权限问题,但我可以手动登录并将文件夹上传到正确的位置。然后我尝试获取我能够的目录列表。我无法将文件夹上传到根目录。我非常绝望!我甚至不知道在哪里谷歌!

 string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"].ToString();
  string uri = remoteDirectory;
  FileInfo fileInf = new FileInfo(FileToUpload);
  // Create FtpWebRequest object from the Uri provided
  FtpWebRequest reqFTP = null;
  reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
  reqFTP.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
  reqFTP.KeepAlive = false;
  reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
  // Specify the data transfer type.
  reqFTP.UseBinary = true;
  // Notify the server about the size of the uploaded file
  reqFTP.ContentLength = fileInf.Length;
  // The buffer size is set to 2kb
  int buffLength = 2048;
  byte[] buff = new byte[buffLength];
  int contentLen;
  // open file to be uploaded
  using (FileStream fs = fileInf.OpenRead())
  {
  try
  {
  // Stream to which the file to be upload is written
  using (Stream strm = reqFTP.GetRequestStream())
  {
  // Read from the file stream 2kb at a time till Stream content ends
  contentLen = fs.Read(buff, 0, buffLength);
  while (contentLen != 0)
  {
  // Write Content from the file stream to the FTP Upload Stream
  strm.Write(buff, 0, contentLen);
  contentLen = fs.Read(buff, 0, buffLength);
  }
  }
  reqFTP = null;
  ////Update the database with the new image location and delete the img from the uploadedimages folder
  //DataAccess.UpdateImageDB(item.ProductID, item.ImgFolder + "/" + item.IMG);
  System.IO.File.Delete(fileInf.ToString());
  }
  {
  Console.WriteLine(ex.Message, "Upload Error");
  }

3 个答案:

答案 0 :(得分:0)

您可能需要检查目录(文件夹)是否存在,如果不存在,则需要在FTP上创建它。我很确定大多数FTP客户端都是这样做的。

答案 1 :(得分:0)

我必须进入NTFS权限,并将带有“完全控制”的IUSR添加到ftp文件夹。

答案 2 :(得分: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