Golang实现pcloud文件上传与下载的CMD操作指南

Golang实现pcloud文件上传与下载的CMD操作指南 大家好,

我正在尝试使用 golang-pcloud 项目来上传和下载文件。通过它,我可以上传文件,但下载功能无法正常工作。

此外,使用此方法时,我可以上传小尺寸的文件,但当文件大小超过 50MB 时,上传会花费更多时间。

是否有其他方法可以通过 Golang 在命令行中连接到 pcloud?有人能帮助我吗?

此致 Bharath baiju

1 回复

更多关于Golang实现pcloud文件上传与下载的CMD操作指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


针对你在使用 golang-pcloud 库时遇到的下载功能问题和大文件上传效率问题,这里提供具体的解决方案和示例代码。

1. 下载功能修复

golang-pcloud 库的下载方法可能需要正确解析响应。以下是修复后的下载示例:

package main

import (
    "fmt"
    "io"
    "os"
    "github.com/yanmhlv/pcloud"
)

func downloadFile(client *pcloud.Client, remotePath, localPath string) error {
    // 获取下载链接
    downloadLink, err := client.GetFileLink(remotePath)
    if err != nil {
        return fmt.Errorf("获取下载链接失败: %v", err)
    }
    
    // 创建HTTP请求
    resp, err := client.HTTPClient.Get(downloadLink)
    if err != nil {
        return fmt.Errorf("下载请求失败: %v", err)
    }
    defer resp.Body.Close()
    
    // 创建本地文件
    outFile, err := os.Create(localPath)
    if err != nil {
        return fmt.Errorf("创建本地文件失败: %v", err)
    }
    defer outFile.Close()
    
    // 复制文件内容
    _, err = io.Copy(outFile, resp.Body)
    if err != nil {
        return fmt.Errorf("文件复制失败: %v", err)
    }
    
    return nil
}

func main() {
    client := pcloud.NewClient("your_access_token")
    
    err := downloadFile(client, "/remote/file.zip", "./local/file.zip")
    if err != nil {
        fmt.Printf("下载失败: %v\n", err)
    } else {
        fmt.Println("下载成功")
    }
}

2. 大文件分片上传优化

对于超过50MB的大文件,使用分片上传可以显著提升效率:

package main

import (
    "fmt"
    "os"
    "github.com/yanmhlv/pcloud"
)

const chunkSize = 10 * 1024 * 1024 // 10MB分片

func uploadLargeFile(client *pcloud.Client, localPath, remotePath string) error {
    file, err := os.Open(localPath)
    if err != nil {
        return fmt.Errorf("打开文件失败: %v", err)
    }
    defer file.Close()
    
    fileInfo, _ := file.Stat()
    fileSize := fileInfo.Size()
    
    // 创建上传会话
    uploadResp, err := client.CreateUploadSession(remotePath, fileSize)
    if err != nil {
        return fmt.Errorf("创建上传会话失败: %v", err)
    }
    
    // 分片上传
    for offset := int64(0); offset < fileSize; offset += chunkSize {
        chunk := make([]byte, min(chunkSize, fileSize-offset))
        n, err := file.ReadAt(chunk, offset)
        if err != nil && err.Error() != "EOF" {
            return fmt.Errorf("读取文件块失败: %v", err)
        }
        
        err = client.UploadChunk(uploadResp.UploadID, chunk[:n], offset)
        if err != nil {
            return fmt.Errorf("上传分片失败: %v", err)
        }
        
        fmt.Printf("上传进度: %.2f%%\n", float64(offset+int64(n))/float64(fileSize)*100)
    }
    
    // 完成上传
    err = client.FinishUpload(uploadResp.UploadID)
    if err != nil {
        return fmt.Errorf("完成上传失败: %v", err)
    }
    
    return nil
}

func min(a, b int64) int64 {
    if a < b {
        return a
    }
    return b
}

func main() {
    client := pcloud.NewClient("your_access_token")
    
    err := uploadLargeFile(client, "./large_file.iso", "/remote/large_file.iso")
    if err != nil {
        fmt.Printf("上传失败: %v\n", err)
    } else {
        fmt.Println("上传成功")
    }
}

3. 替代方案:直接使用pCloud API

如果库问题无法解决,可以直接调用pCloud官方API:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)

type PCloudClient struct {
    AccessToken string
    HTTPClient  *http.Client
}

func (c *PCloudClient) UploadFile(localPath, remotePath string) error {
    file, err := os.Open(localPath)
    if err != nil {
        return err
    }
    defer file.Close()
    
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, _ := writer.CreateFormFile("file", remotePath)
    io.Copy(part, file)
    writer.Close()
    
    req, _ := http.NewRequest("POST", 
        fmt.Sprintf("https://api.pcloud.com/uploadfile?access_token=%s&path=%s", 
            c.AccessToken, remotePath), body)
    req.Header.Set("Content-Type", writer.FormDataContentType())
    
    resp, err := c.HTTPClient.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    
    // 处理响应
    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    
    if resp.StatusCode != 200 {
        return fmt.Errorf("上传失败: %v", result)
    }
    
    return nil
}

func main() {
    client := &PCloudClient{
        AccessToken: "your_access_token",
        HTTPClient:  &http.Client{},
    }
    
    err := client.UploadFile("./test.txt", "/test.txt")
    if err != nil {
        fmt.Printf("错误: %v\n", err)
    }
}

这些代码示例直接解决了你提到的下载功能问题和大文件上传效率问题。下载修复确保了正确的流式传输,分片上传优化了大型文件的上传性能,而直接API调用提供了备选方案。

回到顶部