# file_client_go **Repository Path**: lurenjia528/file_client_go ## Basic Information - **Project Name**: file_client_go - **Description**: 文件服务go客户端库 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-08-31 - **Last Updated**: 2022-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # file_client_go ## 开发说明 `作为客户端,依赖应该尽量少,其他人在引用的时候才会最大可能的减少冲突,所以尽量还是使用go自己的方法` ## 文件服务go客户端 上传文件流程: 1. 通过GET请求获取最新上传进度, 2. 分片上传POST请求(小文件(<5M)直接一片就上传), 3. 上传完成调用服务端合并文件POST请求, 4. 服务端根据配置决定是否上传minio. 并发上传: 1. 客户端启动线程池,多goroutine 2. 服务端记录每一片的状态并上锁 3. 其他客户端上传同一片,无法获取锁,直接跳过 4. 服务端合并文件也上锁(只允许一个客户端合并),其他客户端等待结果 断点续传: 1. 其他客户端通过GET请求获取最新上传进度, 2. 继续上传 失败重传: 1. 上传单片文件,失败后,会重试3次 ## 部分开关 | env | value | note | default | |--------------------|-----------------------------|-------------------|---------| | F_UNIQUE_ALGORITHM | XXH/MD5/SHA-1/SHA-256/CRC32 | 校验方法(客户端与服务端需要一致) | XXH | | F_THREAD_NUM | 10 | goroutine数量 | 10 | | F_CHUNK_SIZE | 5242880 | 分片大小(默认 5M) | 5242880 | ## 依赖 ```go github.com/cespare/xxhash/v2 v2.1.2 github.com/panjf2000/ants/v2 v2.5.0 ``` ## 使用方法 ```go package test import ( client "gitee.com/lurenjia528/file_client_go" "log" "testing" ) const ( uploadUri = "http://127.0.0.1:8081/rest/store/v1/store/upload" mergeUri = "http://127.0.0.1:8081/rest/store/v1/store/merge" downloadUri = "http://127.0.0.1:8081/rest/store/v1/store/download/1835133a-a050-4405-8846-b0bae6524ac2" deleteUri = "http://127.0.0.1:8081/rest/store/v1/store/delete/cd0b53ad-d59b-40da-b725-7118da87484f" filePath = "D:\\softwarebag\\WebStorm-2022.1.1.exe" downloadPath = "D:\\work\\code\\archer\\file_server\\static\\dt" clientId = "用户id" ) func TestUpload(t *testing.T) { f := client.FClient.UploadF(filePath, uploadUri, mergeUri, clientId) log.Println("999999999999999999999") log.Printf("%v\n", f) } func TestDownload(t *testing.T) { fileFullPath, err := client.FClient.DownloadF(downloadPath, downloadUri) if err != nil { log.Println("下载失败,err:", err) return } log.Println(fileFullPath) } func TestDelete(t *testing.T) { ok, msg := client.FClient.DeleteF(deleteUri) log.Println(ok, msg) } ```