web-dev-qa-db-fra.com

FTP, GetResponse (), erreur 550 Fichier non disponible

J'ai créé une petite application Windows Forms pour télécharger le fichier sur l'un des sites FTP de nos clients. Mais le problème que je rencontre est que lorsque je lance cette application sur ma machine locale, le fichier est téléchargé avec succès. Mais si je lance ce programme sur notre serveur, je reçois ce message d'erreur.

le serveur distant a renvoyé une erreur: (550) Fichier non disponible (par exemple, fichier introuvable, accès impossible au fichier), sur cette ligne, 'objFTPRequest.GetRequestStream ();'.

Est-ce que quelqu'un sait pourquoi? Dois-je configurer le pare-feu ou autre chose? Voici mon code;

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();
21
chosenOne Thabs

Cette erreur peut avoir plusieurs causes: le fichier n’est pas présent sur le serveur, les autorisations de sécurité sur le fichier, etc.

Vous devez d’abord trouver la cause exacte de l’erreur . Ceci peut être obtenu en utilisant le code suivant

try
{
        //Your code
}
catch(WebException e)
{
        String status = ((FtpWebResponse)e.Response).StatusDescription;
}

Une fois que vous obtenez la cause exacte de l'erreur, vous pouvez aller de l'avant pour la résoudre. 

Voici quelques liens que vous pouvez consulter

http://forums.asp.net/t/1777881.aspx/1

http://nickstips.wordpress.com/2010/10/25/c-ftp-upload-error-the-remote-server-returned-an-error-550-file-unavailable-eg-file-not- found-no-access/

http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/

http://forums.asp.net/t/1374306.aspx/1

30
Microsoft DN

Essayez ceci: ftp: //xxx.xxx.xx.xx: 21 // chemin/nom du fichier

Le "//" après l'adresse du serveur vous lance au répertoire racine. Même si j'avais: ftp: //xxx.xxx.xx.xx: 21/path/filename , cela ne m'a pas amené au bon répertoire.

17
Bremaria

J'ai rencontré le même problème, et voici ce que j'ai fait:

  1. Vérifiez que le système d'exploitation a le droit d'écrire. Trouvez le dossier ftp => right Click => properties => security, alors vous devez savoir ce que vous devez faire.
  2. Vérifiez le serveur FTP ouvrir le droit d'écriture à l'utilisateur que vous avez connecté. Ouvrez IIS => cliquez sur le site ftp => Règles d'autorisation ftp => ajoutez des règles autorisent => choisissez un utilisateur ou un groupe pour définir les droits
  3. Vérifiez le répertoire sur le serveur FTP, faites la même chose pour l’item 2.

Je peux utiliser quatre images pour montrer les droits à définir: enter image description here

enter image description hereenter image description hereenter image description here

7
francis

Cela pourrait être plus simple.

Je suis confronté à un problème similaire et j’ai essayé toutes les solutions suggérées, mais personne n’a travaillé . 

Mauvais code à ma fin 

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

Changez-le en celui-ci simple:

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

puis procced avec la demande de remplissage et envoyer au serveur :)

C'est tout.

Assurez-vous que toutes les autorisations sur le serveur fonctionnent correctement et que vous utilisez les informations d'identification correctes.

4
makemoney2010

Quand j’ai eu le même problème j’ai tout essayé ci-dessus et au bout d’un jour, je me suis rendu compte que le chemin que j’avais créé pour uri ayant un espace entre "/" et le nom du dossier 

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

la chaîne ci-dessus devrait être

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

cette petite erreur génère également la même erreur et c'est une erreur valide car ce n'est pas un chemin valide pour notre fichier s'il contient des espaces entre "/" et le nom du dossier/fichier

1
Shrikant Dandile

Moi aussi j'ai eu ce problème récemment. Ce que j'ai trouvé, c'est que lorsque j'utilise ftpUploadFile, la routine tente de placer le fichier dans le dossier racine FTP. La ligne de commande normale ftp a bien fonctionné. Cependant, émettre une commande pwd à partir de la ligne de commande ftp a révélé que ce serveur particulier définissait un répertoire en cours différent lors de la connexion. La modification de mon ftpUploadFile pour inclure ce dossier a résolu le problème. 

1
user2709214

Afin de résoudre ce problème, il est nécessaire de forcer la commande System.Net.FtpWebRequest à revenir à l'ancien comportement de son fonctionnement dans .Net Framework 2.0/3.5 et à exécuter la commande supplémentaire CWD avant d'exécuter la commande réelle. .

Pour ce faire, le code suivant doit être placé avant toute instance de la classe System.Net.FtpWebRequest. Le code ci-dessous ne doit être appelé qu'une seule 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

1
Taras Kravets

Assurez-vous que le dossier cible "boîte d'envoi" existe . C'était mon problème avec l'erreur 550.

Créez simplement le répertoire cible "sortie" avant le téléchargement.

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
            }
        }
0
Jan Macháček

J'avais le même problème, quand j'ai comparé avec ftpuri et le chemin du nom d'utilisateur, il est résolu Quand je crée un accès ftp, j'ai choisi le chemin comme/nom du répertoire

dans le ftpuri, quand j'ai inclus le nom du répertoire, cela a donné l'erreur et quand j'ai supprimé le nom du répertoire, il est résolu.

ftpuri avec erreur 

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

ftpuri résolu

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

dossier d'accès ftp "/ Project"

0
shankar

Juste pour jeter mon chapeau dans le ring, j'ai eu la même erreur. Lorsque FTPRequest demandait des fichiers du service FTP sur le même ordinateur (même adresse IP). Dans la demande, j’utilisais l’adresse IP de la machine, mais une fois que j’ai changé celle-ci en 127.0.0.1, cela fonctionnait. Il est intéressant de noter que les demandes provenant d’autres adresses IP étaient en cours de traitement et les fichiers téléchargés, mais pas de lui-même. 

J'espère que ça a aidé quelqu'un.

0
dellyjm

Dans mon cas, il manquait un dossier racine référencé dans mon adresse ftp. Après avoir créé le dossier, le problème a été résolu.

ftp: //xxx.xxx.xx.xx: 21 // dossier racine/

0
Edu Pelais

J'ai eu ce problème. Filezilla allait bien, pas Net. C’était sur un serveur wordpress . Pour que cela fonctionne, j’ai changé le code suivant:

ftp://XXX.XXX.XXX.XXX//folder// "+ txtFile.Text

à:

ftp: // [FTPNAME] @ XXX.XXX.XXX.XXX // "+ txtFile.Text

et cela fonctionne heureusement maintenant.

Je ne sais pas si cela est spécifique aux dossiers FTP de Wordpress.

0
BingoCoder

J'ai trouvé la solution. Le problème est le répertoire de travail actuel de l'utilisateur ftp. Si vous tapez une URL telle que ftp: ///path/test.txt, elle est utilisée comme chemin relatif dans le répertoire de travail. Par exemple, CWD est/test, le chemin utilisé est /test/path/test.txt. Si vous voulez utiliser un chemin absolu, vous devez taper l'URL comme ftp: ////path/test.txt. Ensuite, le fichier est chargé dans le dossier /path/test.txt, sans exception.

0
sham