{"id":37019878,"url":"https://github.com/ymyang/fdfs","last_synced_at":"2026-01-14T02:13:40.165Z","repository":{"id":51098377,"uuid":"41303791","full_name":"ymyang/fdfs","owner":"ymyang","description":"FastDFS nodejs client","archived":false,"fork":false,"pushed_at":"2021-05-24T05:18:36.000Z","size":109,"stargazers_count":81,"open_issues_count":8,"forks_count":21,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-10-14T09:56:18.401Z","etag":null,"topics":["fastdfs","nodejs-client"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ymyang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-24T13:11:25.000Z","updated_at":"2024-03-27T14:39:04.000Z","dependencies_parsed_at":"2022-09-01T15:57:22.360Z","dependency_job_id":null,"html_url":"https://github.com/ymyang/fdfs","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/ymyang/fdfs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ymyang%2Ffdfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ymyang%2Ffdfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ymyang%2Ffdfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ymyang%2Ffdfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ymyang","download_url":"https://codeload.github.com/ymyang/fdfs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ymyang%2Ffdfs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastdfs","nodejs-client"],"created_at":"2026-01-14T02:13:39.418Z","updated_at":"2026-01-14T02:13:40.155Z","avatar_url":"https://github.com/ymyang.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nodejs Client for FastDFS\n\n[FastDFS](https://github.com/happyfish100/fastdfs) 是分布式文件存储系统。这个项目是FastDFS的NodeJS客户端，用来与FastDFS Server进行交互，进行文件的相关操作。我测试过的server版本是4.0.6。\n\n# 安装\n\n```shell\n\nnpm install fdfs\n\n```\n\n# 使用\n\n```javascript\n\nvar FdfsClient = require('fdfs');\n\nvar fdfs = new FdfsClient({\n    // tracker servers\n    trackers: [\n        {\n            host: 'tracker.fastdfs.com',\n            port: 22122\n        }\n    ],\n    // 默认超时时间10s\n    timeout: 10000,\n    // 默认后缀\n    // 当获取不到文件后缀时使用\n    defaultExt: 'txt',\n    // charset默认utf8\n    charset: 'utf8'\n});\n\n```\n\n以上是一些基本配置，你还可以自定义你的日志输出工具，默认是使用console\n例如你要使用[debug](https://github.com/visionmedia/debug)作为你的日志输出工具，你可以这么做：\n\n```javascript\n\nvar debug = require('debug')('fdfs');\nvar fdfs = new FdfsClient({\n    // tracker servers\n    trackers: [\n        {\n            host: 'tracker.fastdfs.com',\n            port: 22122\n        }\n    ],\n    logger: {\n        log: debug\n    }\n});\n```\n\n### 上传文件\n\n注：以下fileId为group + '/' + filename，以下的所有操作使用的fileId都是一样\n\n通过本地文件名上传\n\n```javascript\n\nfdfs.upload('e:/shou.jpg').then(function(fileId) {\n    // fileId 为 group + '/' + filename\n    console.log(fileId);\n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n上传Buffer\n\n```javascript\n\nvar fs = require('fs');\n\n// 注意此处的buffer获取方式只为演示功能，实际不会这么去构建buffer\nvar buffer = fs.readFileSync('test.gif');\nfdfs.upload(buffer).then(function(fileId) {\n    // fileId 为 group + '/' + filename\n    console.log(fileId);\n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\nReadableStream\n\n```javascript\n\nvar fs = require('fs');\n\nvar rs = fs.createReadStream('test.gif');\nfdfs.upload(rs).then(function(fileId) {\n    // fileId 为 group + '/' + filename\n    console.log(fileId);\n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n其他一些options，作为第2个参数传入\n\n```js\n\nfdfs.upload('test.gif', {\n    // 上传方法 [upload, uploadAppender, append, modify], 默认为upload\n    method: 'upload',\n    // 指定文件存储的group，不指定则由tracker server分配\n    group: 'group1',\n    // method为append或modify指定追加的源文件\n    fileId: 'group1/M00/00/0F/wKgBeFXlZJuAdsBZAAPm5H9JxDA153.jpg',\n    // file bytes, file参数为ReadableStream时必须指定\n    size: 1024,\n    // method为modify指定追加的源文件的起始点\n    offset: 10240,\n    // 上传文件的后缀，不指定则获取file参数的后缀，不含(.)\n    ext: 'jpg'\n}).then(function(fileId) {\n    // fileId 为 group + '/' + filename\n    console.log(fileId);\n}).catch(function(err) {\n    console.error(err);\n);\n \n```\n\n### 下载文件\n\n下载到本地\n\n```js\n\nfdfs.download(fileId, 'test_download.gif').then(function() {\n    // 下载完成\n    \n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n下载到WritableStream\n\n```js\n\nvar fs = require('fs');\nvar ws = fs.createWritableStream('test_download.gif');\nfdfs.download(fileId, ws).then(function() {\n    // 下载完成\n    \n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n下载文件片段\n\n```js\n\nfdfs.download(fileId, {\n    target: 'test_download.part',\n    offset: 5,\n    bytes: 5\n}).then(function() {\n    // 下载完成\n    \n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n### 删除文件\n\n```js\n\nfdfs.del(fileId).then(function() {\n    // 删除成功\n    \n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n### 获取文件信息\n\n```js\n\nfdfs.getFileInfo(fileId).then(function(fileInfo) {\n    // fileInfo有4个属性\n    // {\n    //   // 文件大小\n    //   size:\n    //   // 文件创建的时间戳，单位为秒\n    //   timestamp:\n    //   // 校验和\n    //   crc32:\n    //   // 最初上传到的storage server的ip\n    //   addr:\n    // }\n    console.log(fileInfo);\n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n### 文件的Meta Data\n\n设置Meta Data, 我只贴出来文件签名信息吧，flag字段如果不传则默认是O\n\n```js\n\n/**\n * @param fileId\n * @param metaData  {key1: value1, key2: value2}\n * @param flag 'O' for overwrite all old metadata (default)\n                'M' for merge, insert when the meta item not exist, otherwise update it\n */\nfdfs.setMetaData(fileId, metaData, flag).then(function() {\n    // 设置成功\n    \n}).catch(function(err) {\n    console.error(err);\n); \n\n```\n\n获取Meta Data\n\n```js\n\nfdfs.getMetaData(fileId).then(function(metaData) {\n    console.log(metaData);\n}).catch(function(err) {\n    console.error(err);\n);\n\n```\n\n### group信息\n\n```js\n\nfdfs.listGroups().then(function(groups) {\n    console.log(groups);\n}).catch(function(err) {\n    console.error(err);\n); \n\n```\n\n### storage信息\n\n```js\n\nfdfs.listStorages(‘group1’).then(function(storages) {\n    console.log(storages);\n}).catch(function(err) {\n    console.error(err);\n); \n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fymyang%2Ffdfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fymyang%2Ffdfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fymyang%2Ffdfs/lists"}