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

如何获取AWS S3存储桶内文件路径以删除文件?

解决Django中删除S3文件时路径错误的问题

核心问题是你用了dokument.file.url获取完整URL,而S3删除操作需要的是桶内的文件相对路径(对象键),直接改用dokument.file.name即可解决——Django的FileField/ImageField的name属性存储的就是文件在存储后端的相对路径,正好匹配S3需要的对象键格式。

修正后的完整代码

from django.shortcuts import get_object_or_404
from django.http import HttpResponse
import boto3
from django.conf import settings
from .models import Dokument

def slett(request, id):
    # 用get_object_or_404避免不存在id时抛出异常
    dokument = get_object_or_404(Dokument, id=id)
    
    # 从Django配置读取密钥,禁止硬编码敏感信息
    s3 = boto3.resource('s3',
        aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY
    )

    bucket_name = 'mydoc'
    # 使用file.name获取S3桶内的文件路径
    file_name = dokument.file.name
    
    try:
        # 执行S3文件删除
        s3.Object(bucket_name, file_name).delete()
        # 删除数据库记录
        dokument.delete()
        return HttpResponse(f"已成功删除文件: {file_name}")
    except Exception as e:
        # 捕获异常并返回错误信息,方便调试
        return HttpResponse(f"删除失败: {str(e)}", status=500)

额外优化建议

  • 禁止硬编码AWS密钥:将AWS密钥配置到Django的settings.py中(例如AWS_ACCESS_KEY_ID = '你的密钥'),通过settings模块读取,避免代码泄露敏感信息。
  • 异常处理:添加try-except块捕获S3操作或数据库操作的异常,避免服务器直接抛出500错误,同时便于排查问题。
  • 使用get_object_or_404:替代Dokument.objects.get(id=id),当传入的id不存在时自动返回404页面,更符合Web应用的错误处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:20:19