如何从Django上传文件至Dropbox?附代码及报错信息
Django向Dropbox上传文件的正确实现方法
当然可以通过代码实现从Django向Dropbox上传文件,你当前的报错是因为对Dropbox API的使用方式有误,下面是问题分析和解决方案:
报错原因
你遇到的TypeError: expected request_binary as binary type, got <class 'str'>,核心问题有两个:
dbx.files_upload()方法的第一个参数要求传入文件的二进制内容,但你传的是文件夹路径字符串;files_upload()是用来上传单个文件的API,无法直接上传整个文件夹。
正确实现代码
下面是遍历本地文件夹(包括子文件夹)并将所有文件上传到Dropbox的完整代码:
import os import dropbox from django.conf import settings from django.http import HttpResponse # 替换为你的Dropbox访问令牌 DROPBOX_TOKEN = "xxxxxxx" # 本地要上传的文件夹路径 LOCAL_UPLOAD_FOLDER = os.path.join(settings.BASE_DIR, 'dcfiles') # Dropbox上的目标根路径,确保结尾有正斜杠 DROPBOX_TARGET_ROOT = "/Apps/backup/" def upload_local_folder_to_dropbox(local_folder, dropbox_root_path): # 初始化Dropbox客户端 dbx = dropbox.Dropbox(DROPBOX_TOKEN) # 遍历本地文件夹的所有文件(包括子文件夹) for root, _, files in os.walk(local_folder): for file_name in files: # 拼接本地文件的完整路径 local_file_path = os.path.join(root, file_name) # 计算当前文件相对于本地根文件夹的路径,保持目录结构 relative_path = os.path.relpath(local_file_path, local_folder) # 拼接Dropbox上的目标文件路径,统一用正斜杠 dropbox_target_path = os.path.join(dropbox_root_path, relative_path).replace("\\", "/") # 以二进制模式读取文件内容 with open(local_file_path, 'rb') as file_obj: file_content = file_obj.read() # 上传文件,设置覆盖模式(如果目标已有同名文件则替换) dbx.files_upload( file_content, dropbox_target_path, mode=dropbox.files.WriteMode.overwrite ) # 在你的Django视图中调用该函数 def strequest(request): # 这里可以添加你的视图逻辑 upload_local_folder_to_dropbox(LOCAL_UPLOAD_FOLDER, DROPBOX_TARGET_ROOT) # 后续逻辑,比如返回响应 return HttpResponse("文件上传完成")
关键注意事项
- 确保已经安装了Dropbox SDK:执行
pip install dropbox - 你的Dropbox令牌需要有文件写入权限,建议在Dropbox开发者后台生成专用的应用令牌
- 如果上传大文件(超过150MB),建议使用Dropbox的分块上传API(
files_upload_session_start等方法),避免内存占用过高 - 代码中处理了Windows系统的路径分隔符问题,确保Dropbox路径统一使用正斜杠
内容的提问来源于stack exchange,提问作者YUID DAAI
相关产品推荐
相关产品推荐

