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

时间:2018-04-13 09:49:25

标签: go ftp

写入磁盘的文件为空,但读取器不是。 我不明白问题出在哪里。 我尝试使用Buffer然后使用String()方法,我可以确认内容正常,但使用此库的Read()方法无效。

我使用的库是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
}

1 个答案:

答案 0 :(得分:1)

您使用ReadWrite错误:

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

Read将读取的字节放入其参数中。由于srcFile是一个nil片,因此它指示读者读取零字节。使用ioutil.ReadAll读取所有字节。

接下来是你使用Write。 Write(b)写入 len(b)字节,但不一定全部写入。您必须检查返回值,并在必要时重复调用Write。

但是,在您的情况下,您只想连接io.Reader(* Response实现io.Reader)和io.Writer(* os.File)。这是io.Copy的用途:

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

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