ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FileCodeBox 文件分享与提取码机制全指南:文本/文件分享、过期策略与分片上传 API 实战

FileCodeBox 文件分享与提取码机制全指南:文本/文件分享、过期策略与分片上传 API 实战 FileCodeBox 文件分享与提取码机制全指南文本/文件分享、过期策略与分片上传 API 实战【免费下载链接】FileCodeBox文件快递柜-匿名口令分享文本文件像拿快递一样取文件FileCodeBox - File Express Cabinet - Anonymous Passcode Sharing Text, Files, Like Taking Express Delivery for Files项目地址: https://gitcode.com/GitHub_Trending/fi/FileCodeBox导读FileCodeBox文件快递柜是一个匿名口令分享系统核心体验是像拿快递一样取文件——分享者上传文件或文本后获得提取码取件者凭提取码即可获取内容。本文以官方分享指南为主体结合仓库源码apps/base/views.py、apps/base/services.py、apps/base/utils.py 等深入讲解两种分享方式、五种过期策略、提取流程、分片上传与断点续传以及错误处理与频率限制。读完本文你将掌握/share/*与/chunk/*全部 API 的调用方式、关键配置项的作用与默认值并能独立完成一次完整的匿名分享与提取。分享方式概览FileCodeBox 在首页提供两种分享入口见下方发送页面截图文本分享直接分享文本内容适合代码片段、配置文件、公告文案等文件分享上传文件进行分享支持各种文件格式可通过allowed_file_types配置白名单。文本分享使用方法在首页选择「文本分享」标签在文本框中输入或粘贴要分享的内容选择过期方式和时间点击「分享」按钮获取提取码。文本大小限制文本分享的硬性上限为222KB227,328 字节。该限制在源码中直接写死apps/base/views.py的share_text中max_txt_size 222 * 1024超出时抛出 403 并提示内容过多建议采用文件形式。文本大小按UTF-8 编码计算len(text.encode(utf-8))中文字符通常占用 3 个字节。若内容超过 222KB请改用文件分享方式。API 接口POST /share/text/路由定义见 apps/base/views.py参数类型必填说明textstring是要分享的文本内容expire_valueint否过期数值默认 1expire_stylestring否过期方式默认day响应示例{ code: 200, detail: { code: 123456 } }服务端处理链路share_text先做 UTF-8 大小校验与validate_expire_style白名单校验再调用FileUploadService.create_text_shareapps/base/services.py。文本分享同样走配额预留 → 建分享记录 → 释放配额流程先以text:{uuid}为 token 预留等量存储TTL 300 秒写入FileCodes记录prefix固定为Text、text字段存储原文后再释放配额确保瞬时并发不会突破存储配额存储配额逻辑见 apps/base/quota.py。文件分享使用方法在首页选择「文件分享」标签点击上传区域或将文件拖拽到上传区域选择过期方式和时间点击「上传」按钮获取提取码。支持的三种上传方式点击上传点击上传区域选择文件拖拽上传将文件拖拽到上传区域粘贴上传从剪贴板粘贴图片部分主题支持。文件大小限制与相关配置默认单文件最大上传大小为10MB对应settings.py中upload_size: 1024 * 1024 * 10见 core/settings.py。管理员可通过后台的upload_size配置项修改此限制。服务端在校验时apps/base/services.py 的validate_file_size会对超过上限的请求返回 403。提示如需上传大文件请管理员启用分片上传功能enable_chunk1或适当调大upload_size。文件分享还会经过 apps/base/file_validation.py 的多重校验validate_upload_file会检查扩展名/Content-Type 与allowed_file_types白名单默认[*]即不限validate_file_magic还会读取文件头部魔数默认 64 字节做内容级校验防止伪装扩展名。API 接口POST /share/file/multipart/form-data路由定义见 apps/base/views.py参数类型必填说明filefile是要上传的文件expire_valueint否过期数值默认 1expire_stylestring否过期方式默认day响应示例{ code: 200, detail: { code: 654321, name: example.pdf } }服务端处理链路FileUploadService.create_file_shareapps/base/services.py生成存储路径share/data/YYYY/MM/DD/{uuid}/统一由 apps/base/utils.py 的build_file_path生成普通上传、分片上传、预签名上传共用同一套路径规则以file:{uuid}为 token 预留配额TTL 3600 秒写入存储后端本地磁盘 / S3 / WebDAV / OneDrive由file_storage配置决定见 core/storage.py创建FileCodes记录任一步失败则调用rollback_saved_file回滚已落盘文件并在finally中释放配额。过期设置FileCodeBox 支持五种灵活的过期方式过期方式参数值说明按天过期day文件在指定天数后过期按小时过期hour文件在指定小时后过期按分钟过期minute文件在指定分钟后过期永不过期forever文件永久有效按次数过期count文件在被下载指定次数后过期过期方式组合示例# 文件 3 天后过期 expire_value3, expire_styleday # 文件 12 小时后过期 expire_value12, expire_stylehour # 文件 30 分钟后过期 expire_value30, expire_styleminute # 文件永不过期 expire_value1, expire_styleforever # 文件被下载 5 次后过期 expire_value5, expire_stylecount过期机制的源码实现过期信息统一由 apps/base/utils.py 的get_expire_info计算核心逻辑day/hour/minute基于当前时间UTC8加datetime.timedelta计算expired_at记录中expired_count保持-1表示按时间判定countexpired_at设为一天后但expired_count设为expire_value即按下载次数过期foreverexpired_at与expired_count均为空/负值永不自动过期。数据模型FileCodesapps/base/models.py中的is_expired()方法给出精确判定逻辑expired_at为None则永不过期若expired_count 0则按expired_at时间比较否则按expired_count 0次数耗尽判定。consume_file_usageapps/base/views.py在每次领取时用 SQL 原子更新expired_count并累加used_count并发场景下也不会超发。管理员相关配置expire_style控制用户可选用的过期方式白名单默认[day, hour, minute, forever, count]未在白名单内的请求会被validate_expire_style直接拒绝400max_save_seconds限制文件最长保存时间get_expire_info中若expired_at - now超过该上限会返回 403为0默认时按 7 天兜底限制。过期文件的清理过期数据由后台任务delete_expire_filesapps/base/tasks.py每 10 分钟巡检清理删除expired_at已到或expired_count 0的记录及对应存储文件同时清理本地空目录。提取文件提取是分享的逆操作输入提取码 → 查询文件信息 → 下载或查看内容。使用方法在首页的「提取文件」区域输入提取码点击「提取」按钮系统显示文件信息文件名、大小等点击「下载」按钮下载文件或直接查看文本内容。提取码说明提取码通常为6 位数字永不过期的文件使用字母数字混合的提取码提取码区分大小写针对字母数字混合的情况。提取码生成策略由code_generate_type配置控制默认secret见 core/settings.pyget_code_generate_typeapps/base/utils.py将secret/string归一为字母数字混合风格其他值则归为纯数字风格。get_random_code在生成后会查询FileCodes表确保唯一性apps/base/utils.py。查询文件信息POST /share/select/请求参数{ code: 123456 }响应示例文件{ code: 200, detail: { code: 123456, name: example.pdf, size: 1048576, text: https://example.com/download/... } }响应示例文本{ code: 200, detail: { code: 123456, name: Text, size: 1024, text: This is the shared text content... } }从源码看apps/base/views.py 的select_file与build_select_detailtext字段对文本分享返回原文对文件分享返回下载地址。其中有下载次数限制的文件必须走代理下载接口download_url指向/share/download?...因为第三方直链无法阻止重复使用无次数限制的文件则直接返回存储后端的直链如 S3 预签名地址。同时/share/select/在返回信息时已原子消费一次下载次数。直接下载文件GET /share/select/?code123456此接口apps/base/views.py 的get_code_file直接返回文件内容Content-Disposition附件下载头支持中文文件名适合在浏览器中直接访问文本分享则直接返回纯文本内容。另有带签名鉴权的代理下载接口GET /share/download?key...code...apps/base/views.pykey为基于提取码生成的时间窗签名 token避免下载链接被无限转发。元数据查询GET/POST /share/metadata/apps/base/views.py只返回文件元信息文件名、大小、类型、创建/过期时间、剩余下载次数不消费下载次数适合分享页卡片展示。分片上传大文件对于超过单文件上限的大文件FileCodeBox 提供分片上传功能需管理员启用enable_chunk1。分片会话默认保留24 小时chunk_expire_hours见 core/settings.py超时未完成会被后台任务clean_incomplete_uploadsapps/base/tasks.py每小时清理。分片上传流程1. 初始化上传POST /chunk/upload/init/apps/base/views.py请求参数{ file_name: large_file.zip, file_size: 104857600, chunk_size: 5242880, file_hash: sha256_hash_of_file }参数类型必填说明file_namestring是文件名file_sizeint是文件总大小字节chunk_sizeint否分片大小默认 5MBfile_hashstring是文件的 SHA256 哈希值响应示例{ code: 200, detail: { existed: false, upload_id: abc123def456, chunk_size: 5242880, total_chunks: 20, uploaded_chunks: [] } }服务端在初始化阶段会做几件关键事超限预检按total_chunks × chunk_size估算理论上传量超过upload_size直接 403apps/base/views.py配额预留以chunk:{upload_id}为 token 预留file_size的存储配额TTL 为chunk_expire_hours避免未完成的大文件拖垮存储apps/base/views.py会话标记以chunk_index -1的特殊记录作为上传会话头apps/base/models.py 的UploadChunk模型文件名会经sanitize_filename清洗防路径穿越并校验文件类型。2. 上传分片POST /chunk/upload/chunk/{upload_id}/{chunk_index}multipart/form-dataapps/base/views.pyupload_id初始化时返回的上传会话 IDchunk_index分片索引从 0 开始。请求体为分片文件数据。响应示例{ code: 200, detail: { chunk_hash: sha256_hash_of_chunk } }服务端对每个分片做完整性校验分片索引合法性、分片大小不超过声明值、累计上传量不超过upload_size首分片chunk_index 0还会校验文件头魔数以确认真实类型。每个分片计算 SHA256 存入记录保存成功后才标记completedTrue保证记录与存储一致。3. 完成上传POST /chunk/upload/complete/{upload_id}apps/base/views.py请求参数{ expire_value: 1, expire_style: day }响应示例{ code: 200, detail: { code: 789012, name: large_file.zip } }完成阶段调用FileUploadService.complete_chunked_uploadapps/base/services.py先校验分片完整性已上传分片数必须等于total_chunks再由存储后端merge_chunks按索引顺序合并分片并计算整文件哈希然后创建FileCodes分享记录标记is_chunkedTrue、记录file_hash与upload_id最后清理分片文件与数据库记录、释放配额。断点续传分片上传天然支持断点续传。若上传中断恢复流程为重新调用初始化接口使用相同的file_hash服务器按chunk_hash file_size file_name匹配未完成的会话返回已上传分片索引列表uploaded_chunks客户端只需上传未在列表中的分片对已上传的分片重复提交时服务端会直接返回{chunk_hash: ..., skipped: true}跳过。辅助接口GET /chunk/upload/status/{upload_id}查询上传状态返回已上传分片列表与progress百分比apps/base/views.pyDELETE /chunk/upload/{upload_id}取消上传清理存储中的临时分片与数据库记录并释放配额apps/base/views.py。错误处理常见错误码错误码说明解决方案403文件大小超过限制减小文件大小或联系管理员调整upload_size/ 启用分片上传403内容过多文本超过 222KB请改用文件分享403上传频率限制等待限制时间窗口过后重试404文件不存在检查提取码是否正确404文件已过期文件已过期或下载次数已用完频率限制为防止滥用系统对上传、元数据查询与提取操作实施基于 IP 的频率限制apps/base/dependencies.py 的IPRateLimit实现限额配置见 core/settings.py上传限制默认upload_count10/upload_minute1即每分钟最多 10 次上传错误限制默认error_count10/error_minute1即每分钟最多 10 次错误尝试提取失败、下载鉴权失败等都会计数元数据查询复用错误限制额度。命中限制后请等待时间窗口1 分钟过后再重试。限流计数为内存态并会由delete_expire_files定时清理过期 IP 记录。error_count、error_minute、upload_count、upload_minute均可在后台配置。分享相关配置速查以下配置项直接决定分享体验均在管理面板中可调默认值见 core/settings.py配置项默认值作用upload_size10MB单文件/单次分片上传大小上限expire_style全部五种用户可选的过期方式白名单max_save_seconds0按 7 天兜底文件最长保存时间上限enable_chunk0是否启用分片上传chunk_expire_hours24分片上传会话有效时长code_generate_typesecret提取码风格数字 / 字母数字混合allowed_file_types[*]允许上传的文件类型白名单upload_count/upload_minute10 / 1上传频率限制error_count/error_minute10 / 1错误尝试频率限制open_upload1是否开放匿名上传配置修改后由 apps/base/config.py 的refresh_settings从数据库热加载到运行时带 2 秒 TTL 缓存无需重启服务。下一步配置说明了解如何配置分享相关设置存储配置了解文件存储方式本地 / S3 / WebDAV / OneDrive安全设置了解安全相关配置管理面板了解如何管理分享的文件预签名上传 API面向 S3 直传的大文件上传方案【免费下载链接】FileCodeBox文件快递柜-匿名口令分享文本文件像拿快递一样取文件FileCodeBox - File Express Cabinet - Anonymous Passcode Sharing Text, Files, Like Taking Express Delivery for Files项目地址: https://gitcode.com/GitHub_Trending/fi/FileCodeBox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表