2010-12-06 19 views
2

J'essaye de télécharger des images sur le ftp. Je dois l'avoir dans un dossier compressé appelé par un nom spécifique, puis télécharger ce dossier dans un répertoire spécifique. Chaque fois que j'essaie, j'obtiens une erreur Le serveur distant a renvoyé une erreur: (550) Fichier indisponible Ce code fonctionne correctement lorsque j'essaie de télécharger une image à la fois. Ici, j'essaye de télécharger un dossier entier. J'ai vérifié l'uri (je l'ai copié du débogage) et il est allé très bien. Existe-t-il une manière différente de faire les dossiers de téléchargement? Je pensais que c'était un problème d'autorisation d'écriture, mais je peux me connecter et télécharger manuellement un dossier à l'endroit approprié. J'ai alors essayé d'obtenir la liste de répertoire que je suis capable de. Je ne suis pas en mesure de télécharger le dossier à la racine non plus. Je suis vraiment désespéré! Je ne sais même pas où google!Le téléchargement d'un dossier dans le sous-dossier ftp renvoie le fichier d'erreur (550) indisponible, pas d'accès

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"); 
    } 

Répondre

0

Vous avez probablement besoin de vérifier pour voir si le répertoire (dossier) existe et si elle ne le fait pas, alors vous devez créer sur le FTP. Je suis sûr que la plupart des clients FTP le font pour vous.

+0

Je sais que le dossier existe. Je tire le nom du dossier de la base de données. Aussi, quand je l'ai franchi, j'ai copié et collé l'uri dans le navigateur et ça ne pose aucun problème. – SSs

+0

Lorsque je me connecte à mon ftp avec FileZilla, j'ai remarqué que par le propriétaire/groupe est dit personne roue. Cela aurait-il quelque chose à voir avec cela? – SSs

+0

Il est possible que ce soit un problème d'autorisations avec le dossier. –

0

Je devais entrer dans les autorisations NTFS, et ajouter IUSR avec "contrôle total" dans le dossier ftp.

0

Pour résoudre ce problème, il est nécessaire de forcer la commande System.Net.FtpWebRequest à revenir à l'ancien comportement de la façon dont il fonctionnait dans .Net Framework 2.0/3.5 et d'émettre la commande supplémentaire CWD avant l'émission de la commande réelle. Pour ce faire, le code suivant doit être placé avant que toute instance de la classe System.Net.FtpWebRequest soit invoquée. Le code ci-dessous n'a besoin d'être appelé qu'une fois, car il modifie les paramètres de l'ensemble du domaine d'application.

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