82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
package pkg
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/jlaffaye/ftp"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
// initFtpClient initializes and authenticates an FTP client
|
|
func initFtpClient() (*ftp.ServerConn, error) {
|
|
ftpConfig := initFtpConfig()
|
|
ftpClient, err := ftp.Dial(fmt.Sprintf("%s:%s", ftpConfig.host, ftpConfig.port), ftp.DialWithTimeout(5*time.Second))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to connect to FTP: %w", err)
|
|
}
|
|
|
|
err = ftpClient.Login(ftpConfig.user, ftpConfig.password)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to log in to FTP: %w", err)
|
|
}
|
|
|
|
return ftpClient, nil
|
|
}
|
|
|
|
// CopyToFTP uploads a file to the remote FTP server
|
|
func CopyToFTP(fileName, remotePath string) (err error) {
|
|
ftpConfig := initFtpConfig()
|
|
ftpClient, err := initFtpClient()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer ftpClient.Quit()
|
|
|
|
filePath := filepath.Join(tmpPath, fileName)
|
|
file, err := os.Open(filePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to open file %s: %w", fileName, err)
|
|
}
|
|
defer file.Close()
|
|
|
|
remoteFilePath := filepath.Join(ftpConfig.remotePath, fileName)
|
|
err = ftpClient.Stor(remoteFilePath, file)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to upload file %s: %w", fileName, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CopyFromFTP downloads a file from the remote FTP server
|
|
func CopyFromFTP(fileName, remotePath string) (err error) {
|
|
ftpClient, err := initFtpClient()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer ftpClient.Quit()
|
|
|
|
remoteFilePath := filepath.Join(remotePath, fileName)
|
|
r, err := ftpClient.Retr(remoteFilePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to retrieve file %s: %w", fileName, err)
|
|
}
|
|
defer r.Close()
|
|
|
|
localFilePath := filepath.Join(tmpPath, fileName)
|
|
outFile, err := os.Create(localFilePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create local file %s: %w", fileName, err)
|
|
}
|
|
defer outFile.Close()
|
|
|
|
_, err = io.Copy(outFile, r)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to copy data to local file %s: %w", fileName, err)
|
|
}
|
|
|
|
return nil
|
|
}
|