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

在Django中不使用模型直接将文件保存到磁盘文件夹的最简方法

嘿,我来帮你搞定这个无模型直接保存上传文件到磁盘的需求!下面是基于你现有代码的最简实现方案,一步步来:

最简实现:Django无模型直接存储上传文件

1. 完善视图的文件保存逻辑

首先补全你的视图代码,添加文件写入的核心逻辑,同时处理文件夹创建、分块写入这些细节:

import os
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadForm

def uploadview(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            # 获取上传的文件对象
            uploaded_file = request.FILES['file']
            # 定义目标保存文件夹:media/files
            save_dir = os.path.join('media', 'files')
            # 确保文件夹存在,不存在则自动创建
            os.makedirs(save_dir, exist_ok=True)
            # 拼接完整的文件保存路径
            full_file_path = os.path.join(save_dir, uploaded_file.name)
            
            # 分块写入文件(大文件友好,避免内存占用过高)
            with open(full_file_path, 'wb+') as destination:
                for chunk in uploaded_file.chunks():
                    destination.write(chunk)
            
            # 上传成功后跳转或返回提示(这里替换成你的成功页面路由)
            return HttpResponseRedirect('/upload-success/')
    else:
        # GET请求时初始化表单
        form = UploadForm()
    
    return render(request, 'upload.html', {'form': form})

2. 配置Django的MEDIA相关设置

在项目的settings.py里添加MEDIA路径配置(规范且方便后续访问文件):

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 配置媒体文件根目录和访问URL
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

然后在项目的主urls.py中添加媒体文件的路由,这样前端可以直接访问上传的文件:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path
from .views import uploadview  # 替换成你的视图所在路径

urlpatterns = [
    path('admin/', admin.site.urls),
    path('upload/', uploadview, name='upload'),
    # 其他路由...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

3. 上传页面模板(必备)

创建一个简单的模板upload.html,注意表单必须添加enctype="multipart/form-data"才能正常上传文件:

<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <h2>上传文件到media/files</h2>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">确认上传</button>
    </form>
</body>
</html>

额外优化小技巧

如果你担心文件名重复(比如用户上传同名文件会覆盖旧文件),可以给文件名加上时间戳来区分:

from datetime import datetime
# 生成时间戳前缀
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
# 拼接新文件名
unique_filename = f"{timestamp}_{uploaded_file.name}"
full_file_path = os.path.join(save_dir, unique_filename)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:10:01