求助:Python上传本地最新视频至Dropbox的代码异常问题
嘿,我来帮你搞定这两个Dropbox上传的问题,这俩坑我之前也踩过,给你梳理下解决方案:
问题1:上传的视频损坏无法播放
这个问题90%的概率是文件读取模式不对导致的——视频是二进制文件,如果用文本模式('r')读取再上传,会破坏文件的二进制结构,导致Dropbox上的文件损坏。
解决办法很简单:读取本地视频文件时一定要用二进制读取模式('rb'),并且在Dropbox SDK的files_upload方法里正确传递二进制内容。
举个测试用的代码示例:
import dropbox import os # 初始化Dropbox客户端 dbx = dropbox.Dropbox("你的访问令牌") # 本地视频文件路径 local_video_path = "/path/to/your/latest/video.mp4" # 以二进制模式读取文件 with open(local_video_path, 'rb') as f: file_content = f.read() # 先上传一个临时文件测试能否播放 try: dbx.files_upload(file_content, "/temp_test_video.mp4") print("文件上传成功!") except Exception as e: print(f"上传出错:{e}")
你可以先跑这段代码,看看Dropbox上的temp_test_video.mp4能不能正常播放——如果可以,就说明是读取模式的问题,接下来处理文件名的问题。
问题2:保留带时间戳的原文件名
文件名被自动重命名,通常是因为你在调用files_upload时,手动指定了新的远程文件名,或者不小心用了其他生成的名称。要保留原文件名,只需要把本地文件的原始文件名直接作为Dropbox的远程路径即可。
结合两个问题的完整解决方案代码:
import dropbox import os from pathlib import Path def upload_latest_video_to_dropbox(local_folder, access_token): dbx = dropbox.Dropbox(access_token) # 获取文件夹里的所有视频文件(可根据自己的格式调整后缀) video_files = [f for f in Path(local_folder).iterdir() if f.suffix.lower() in ('.mp4', '.mov', '.avi')] # 按修改时间排序,取最新的视频文件 latest_video = max(video_files, key=lambda x: x.stat().st_mtime) original_filename = latest_video.name # 直接获取带时间戳的原文件名 # 二进制读取并上传,远程路径直接用原文件名 with open(latest_video, 'rb') as f: try: # 用WriteMode.add会在文件名重复时自动加后缀;用overwrite则覆盖同名文件 dbx.files_upload( f.read(), f"/{original_filename}", mode=dropbox.files.WriteMode("add") ) print(f"成功上传最新视频:{original_filename}") except dropbox.exceptions.ApiError as e: print(f"API错误:{e}") # 调用示例 if __name__ == "__main__": YOUR_LOCAL_FOLDER = "/path/to/your/video/folder" YOUR_DROPBOX_TOKEN = "你的Dropbox访问令牌" upload_latest_video_to_dropbox(YOUR_LOCAL_FOLDER, YOUR_DROPBOX_TOKEN)
这里的核心是original_filename = latest_video.name直接获取本地原文件名,然后把远程路径设为f"/{original_filename}",这样Dropbox上的文件名就和本地完全一致了。另外如果需要覆盖同名文件,把WriteMode("add")改成WriteMode("overwrite")就行。
最后再确认下:确保你用的是官方dropbox Python库(可以用pip install dropbox安装),并且你的访问令牌有足够的文件写入权限。
内容的提问来源于stack exchange,提问作者kwjamesblond
相关产品推荐
相关产品推荐

