You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django项目Docker容器中通过chromedriver正确保存文件到指定目录

问题核心原因

  • 你使用的是远程独立Chrome容器,download.default_directory配置的是Chrome容器内部的绝对路径,而非Django容器的本地路径,两边路径如果没有对应一致就会写入失败
  • 旧版无头Chrome模式默认不支持自定义下载目录,权限配置缺失也会导致写入被禁止

分步解决方案

1. 修正下载路径配置

你Docker Compose中已经将共享卷media挂载到Chrome容器的/app/media路径,直接给Chrome传递容器内的绝对路径即可,不要使用Django侧的settings.MEDIA_ROOT拼接(除非两边容器的MEDIA_ROOT路径完全一致):

# 直接写Chrome容器内的目标路径
download_dir = "/app/media/uploads"

2. 补充Chrome启动参数与配置

替换旧版无头模式配置,补充必要的权限参数,完善prefs配置:

options = webdriver.ChromeOptions()
# 替换旧版无头模式为新版无头,避免下载限制
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
# User Agent
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84')
# Disable driver mode
options.add_argument('--disable-blink-features=AutomationControlled')

# Download settings
download_dir = "/app/media/uploads"

prefs = {
    'download.default_directory': download_dir,
    'download.prompt_for_download': False,
    'download.directory_upgrade': True,
    'safebrowsing_for_trusted_sources_enabled': False,
    'safebrowsing.enabled': False,
    # 禁止弹窗拦截下载
    'profile.default_content_settings.popups': 0,
    # 允许自动下载多文件
    'profile.default_content_setting_values.automatic_downloads': 1
}
options.add_experimental_option('prefs', prefs)

driver = webdriver.Remote("http://chrome:4444/wd/hub", options=options)

3. 修复目录权限问题

selenium/standalone-chrome默认使用uid为1200的selenium用户运行,需要保证目标目录有写入权限:

  • 进入Chrome容器验证权限:docker exec -it Chrome-selenium bash
  • 执行测试写入:sudo -u selenium touch /app/media/uploads/test.txt

如果提示权限不足,执行以下命令修改目录权限(可在Django容器或者宿主机挂载的对应目录执行):

chown -R 1200:1200 /app/media/uploads
chmod -R 775 /app/media/uploads

4. 排查文件实际存储位置

如果还是找不到下载文件,可以通过以下代码读取Chrome的下载记录,获取实际写入路径:

# 触发下载后执行
driver.get("chrome://downloads/")
download_items = driver.execute_script("return downloads.Manager.get().items_")
for item in download_items:
    print(f"下载文件路径:{item.get('filePath')}")

内容的提问来源于stack exchange,提问作者Razilator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:51:03