web-dev-qa-db-fra.com

Télécharger le fichier sur FTP

Je veux télécharger le fichier d'un serveur à un autre serveur FTP et voici mon code pour télécharger le fichier, mais il y a une erreur telle que: 

Le serveur distant a renvoyé une erreur: (550) Fichier non disponible (par exemple, fichier non trouvé, pas d'accès).

C'est mon code:

string CompleteDPath = "ftp URL";
string UName = "UserName";
string PWD = "Password";
WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);
reqObj.Method = WebRequestMethods.Ftp.UploadFile;
reqObj.Credentials = new NetworkCredential(UName, PWD);
FileStream streamObj = System.IO.File.OpenRead(Server.MapPath(FileName));
byte[] buffer = new byte[streamObj.Length + 1];
streamObj.Read(buffer, 0, buffer.Length);
streamObj.Close();
streamObj = null;
reqObj.GetRequestStream().Write(buffer, 0, buffer.Length);
reqObj = null; 

Pouvez-vous s'il vous plaît me dire où je vais mal?

23
R.D.

Assurez-vous que votre chemin FTP est défini comme indiqué ci-dessous.

string CompleteDPath = "ftp://www.example.com/wwwroot/videos/";

string FileName = "sample.mp4";

WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);

Le script suivant fonctionne très bien avec moi pour télécharger des fichiers et des vidéos sur un autre serveur via ftp.

FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl + "" + username + "_" + filename);
ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword);
ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
ftpClient.UseBinary = true;
ftpClient.KeepAlive = true;
System.IO.FileInfo fi = new System.IO.FileInfo(fileurl);
ftpClient.ContentLength = fi.Length;
byte[] buffer = new byte[4097];
int bytes = 0;
int total_bytes = (int)fi.Length;
System.IO.FileStream fs = fi.OpenRead();
System.IO.Stream rs = ftpClient.GetRequestStream();
while (total_bytes > 0)
{
   bytes = fs.Read(buffer, 0, buffer.Length);
   rs.Write(buffer, 0, bytes);
   total_bytes = total_bytes - bytes;
}
//fs.Flush();
fs.Close();
rs.Close();
FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse();
value = uploadResponse.StatusDescription;
uploadResponse.Close();
37
irfanmcsd

Voici un exemple de code pour télécharger un fichier sur un serveur FTP

    string filename = Server.MapPath("file1.txt");
    string ftpServerIP = "ftp.demo.com/";
    string ftpUserName = "dummy";
    string ftpPassword = "dummy";

    FileInfo objFile = new FileInfo(filename);
    FtpWebRequest objFTPRequest;

    // Create FtpWebRequest object 
    objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + 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();

    try
    {
        // 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();
    }
    catch (Exception ex)
    {
        throw ex;
    }
13
Jayesh Sorathia

Vous pouvez également utiliser le type WebClient de niveau supérieur pour effectuer des tâches FTP avec un code plus propre:

using (WebClient client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://ftpserver.com/target.Zip", "STOR", localFilePath);
}
13
Saeb Amini

Au cas où vous auriez encore des problèmes, voici ce qui m'a permis de surmonter tout cela… .. J'avais la même erreur malgré le fait que je pouvais parfaitement voir le fichier dans le répertoire que j'essayais de télécharger - c'est-à-dire: I était en train d'écraser un fichier.

Mon URL ftp ressemblait à:

// ftp://www.mywebsite.com/testingdir/myData.xml
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.mywebsite.com/testingdir/myData.xml"

Ainsi, mes informations d'identification utilisent mon nom d'utilisateur de testeur et PW;

request.Credentials = new NetworkCredential ("tester", "testerpw");

Eh bien, mon compte ftp "testeur" est défini sur " ftp://www.mywebsite.com/testingdir " mais quand je suis en fait ftp [par exemple, de Explorer], je viens de mettre " ftp: // www .mywebsite.com "et connectez-vous avec mes identifiants de testeur et recevez automatiquement le message" testingdir ".

Donc, pour que cela fonctionne en C #, je me suis retrouvé à utiliser l’url - ftp://www.mywebsite.com/myData.xml À condition que les informations d’identité de mon compte testeur et tout se passe bien. 

2
user1086279
  1. Assurez-vous que votre URL que vous passez à WebRequest.Create a le format suivant:

    ftp://ftp.example.com/remote/path/file.Zip
    
  2. Il existe des moyens plus simples de télécharger un fichier à l'aide de .NET Framework.

Moyen le plus simple

Le moyen le plus simple de télécharger un fichier sur un serveur FTP à l'aide de .NET Framework consiste à utiliser la méthode WebClient.UploadFile :

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.UploadFile("ftp://ftp.example.com/remote/path/file.Zip", @"C:\local\path\file.Zip");

Options avancées

Si vous avez besoin d'un contrôle plus important que WebClient n'offre pas (comme le cryptage TLS/SSL, le mode ASCII, le mode actif, etc.), utilisez FtpWebRequest , comme vous. Mais vous pouvez rendre le code plus simple et plus efficace en utilisant Stream.CopyTo :

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.Zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;  

using (Stream fileStream = File.OpenRead(@"C:\local\path\file.Zip"))
using (Stream ftpStream = request.GetRequestStream())
{
    fileStream.CopyTo(ftpStream);
}

Pour encore plus d'options, y compris la surveillance de la progression et le téléchargement du dossier complet, voir:
Téléchargez le fichier sur FTP en utilisant C #

1
Martin Prikryl

Voici la solution !!!!!!

Pour télécharger tous les fichiers du répertoire local (ex: D:\Documents) vers l’URL FTP (ex: ftp:\{adresse ip}\{nom du sous-répertoire})

public string UploadFile(string FileFromPath, string ToFTPURL, string SubDirectoryName, string FTPLoginID, string
FTPPassword)
    {
        try
        {
            string FtpUrl = string.Empty;
            FtpUrl = ToFTPURL + "/" + SubDirectoryName;    //Complete FTP Url path

            string[] files = Directory.GetFiles(FileFromPath, "*.*");    //To get each file name from FileFromPath

            foreach (string file in files)
            {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FtpUrl + "/" + Path.GetFileName(file));
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(FTPLoginID, FTPPassword);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;

                FileStream stream = File.OpenRead(FileFromPath + "\\" + Path.GetFileName(file));
                byte[] buffer = new byte[stream.Length];


                stream.Read(buffer, 0, buffer.Length);
                stream.Close();

                Stream reqStream = request.GetRequestStream();
                reqStream.Write(buffer, 0, buffer.Length);
                reqStream.Close();
            }
            return "Success";
        }
        catch(Exception ex)
        {
            return "ex";
        }

    }
0
vignesh k