如何将wget下载的视频直接上传至Dropbox,无需本地存储?
实现流式下载并直接上传至Dropbox(避免本地存储)
你没法直接用wget.download()指定Dropbox路径,因为wget模块是针对本地文件系统设计的。要实现边下载边上传、不存完整文件到本地的需求,得用流式处理+Dropbox分块上传的方案,具体步骤如下:
核心思路
- 用
requests库流式获取视频内容(代替wget),无需一次性把整个视频加载到内存或存到本地。 - 用Dropbox Python SDK的文件上传会话功能,把下载到的分块数据直接上传到Dropbox,全程仅保留小块数据在内存中。
代码实现
先安装依赖:
pip install requests dropbox
完整代码示例:
import requests import dropbox # 配置参数 DROPBOX_ACCESS_TOKEN = "你的Dropbox访问令牌" VIDEO_URL = "目标视频的下载链接" DROPBOX_TARGET_PATH = "/Dropbox目标路径/视频文件名.mp4" # 示例:"/videos/my_video.mp4" CHUNK_SIZE = 4 * 1024 * 1024 # 4MB,Dropbox要求分块至少4MB(最后一块除外) def stream_upload_to_dropbox(): # 初始化Dropbox客户端 dbx = dropbox.Dropbox(DROPBOX_ACCESS_TOKEN) # 流式获取视频内容 with requests.get(VIDEO_URL, stream=True) as r: r.raise_for_status() # 启动上传会话 session_start_result = dbx.files_upload_session_start(r.raw.read(CHUNK_SIZE)) session_id = session_start_result.session_id cursor = dropbox.files.UploadSessionCursor(session_id=session_id, offset=CHUNK_SIZE) commit = dropbox.files.CommitInfo(path=DROPBOX_TARGET_PATH) # 分块上传剩余内容 while True: chunk = r.raw.read(CHUNK_SIZE) if not chunk: break if len(chunk) < CHUNK_SIZE: # 上传最后一块并完成会话 dbx.files_upload_session_finish(chunk, cursor, commit) else: dbx.files_upload_session_append(chunk, cursor.session_id, cursor.offset) cursor.offset += len(chunk) if __name__ == "__main__": stream_upload_to_dropbox()
关键说明
- 流式下载:
requests.get添加stream=True后,响应体不会一次性下载到内存,而是通过r.raw.read()逐块读取。 - Dropbox分块上传:针对大文件,会话上传能避免网络问题导致整个上传失败,4MB是官方推荐的最小有效分块大小。
- 参数替换:需将
DROPBOX_ACCESS_TOKEN替换为你的有效令牌(在Dropbox开发者控制台创建应用获取),并修改VIDEO_URL和DROPBOX_TARGET_PATH为实际值。
小文件简化方案
如果视频文件小于150MB,可简化为一次性读取内容后直接上传:
import requests import dropbox dbx = dropbox.Dropbox("你的Dropbox访问令牌") video_content = requests.get(VIDEO_URL).content dbx.files_upload(video_content, "/目标路径/文件名.mp4")
但该方式不适合大文件,容易占用过多内存。
内容的提问来源于stack exchange,提问作者Ari Gordon
相关产品推荐
相关产品推荐

