写入磁盘的文件为空,但读取器不是。
我不明白问题出在哪里。
我尝试使用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
}
答案 0 :(得分:1)
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()