Maison  >  Article  >  développement back-end  >  Problème d'écriture du fichier sur le disque après le téléchargement via FTP

Problème d'écriture du fichier sur le disque après le téléchargement via FTP

PHPz
PHPzavant
2024-02-08 22:30:21596parcourir

通过 FTP 下载文件后将文件写入磁盘时出现问题

Éditeur php Xinyi, vous pouvez parfois rencontrer des problèmes lors du téléchargement de fichiers via FTP et de leur écriture sur le disque. Cela peut être dû à des problèmes de connexion réseau, à des paramètres d'autorisation incorrects ou à un espace disque insuffisant. Dans ce cas, nous devons soigneusement vérifier et résoudre ces problèmes pour garantir que le fichier peut être téléchargé et écrit avec succès sur le disque. Dans cet article, nous explorerons quelques solutions possibles et erreurs courantes, et fournirons quelques conseils utiles pour les corriger. Que vous soyez nouveau dans l'utilisation de FTP ou que vous le connaissiez déjà, ces informations vous seront utiles.

Contenu de la question

Le fichier écrit sur le disque est vide, mais le lecteur n'est pas vide. Je ne comprends pas quel est le problème. J'ai essayé d'utiliser la méthode Buffer 然后使用 String() 方法,我可以确认内容没问题,但是使用该库的 Read() qui n'a pas fonctionné.

La bibliothèque que j'utilise est github.com/jlaffaye/ftp

// pullFileByFTP
func pullFileByFTP(fileID, server string, port int64, username, password, path, file string) error {
    // Connect to the server
    client, err := ftp.Dial(fmt.Sprintf("%s:%d", server, port))
    if err != nil {
        return err
    }

    // Log in the server
    err = client.Login(username, password)
    if err != nil {
        return err
    }

    // Retrieve the file
    reader, err := client.Retr(fmt.Sprintf("%s%s", path, file))
    if err != nil {
        return err
    }

    // Read the file
    var srcFile []byte
    _, err = reader.Read(srcFile)
    if err != nil {
        return err
    }

    // Create the destination file
    dstFile, err := os.Create(fmt.Sprintf("%s/%s", shared.TmpDir, fileID))
    if err != nil {
        return fmt.Errorf("Error while creating the destination file : %s", err)
    }
    defer dstFile.Close()

    // Copy the file
    dstFile.Write(srcFile)

    return nil
}

Solution

Vous utilisez Read et WriteErreur :

var srcFile []byte
_, err = reader.Read(srcFile)

Read met les octets lus dans son argument. Puisque srcFile est une tranche nulle, cela demande au lecteur de lire zéro octet. Utilisez ioutil.ReadAll pour lire tous les octets.

La prochaine étape est l'utilisation de Write. Write(b) Écrivez au plus len(b) octets, mais pas nécessairement tous. Vous devez vérifier la valeur de retour et appeler Write à plusieurs reprises si nécessaire.

Cependant, dans votre cas, vous souhaitez uniquement connecter io.Reader (*Response implémente io.Reader) et io.Writer (*os.File). Voilà à quoi sert io.Copy :

reader, err := client.Retr(path + file)
dstFile, err := ioutil.TempFile("", fileID)

_, err := io.Copy(dstFile, reader)
err := dstFile.Close()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer