3

如果从 Web 浏览器上传文件,则在服务器的上传目录中会出现image.png一个名为的新文件。image.png

如果我然后上传另一个名为image.png(同名)的文件,一个名为的新文件image_aj642zm.png将出现在服务器上的上传目录中。

然后,如果我上传另一个名为image.png(同样名称)的文件image_z6z2BaQ.png,服务器上的上传目录中将出现一个名为的新文件。

如果上传目录中已经存在同名的文件,Django 使用什么方法重命名上传的文件?(即额外的_aj642zm_z6z2BaQ来自哪里?)

常规设置:

在模型.py 中:

from django.db import models

class Image(models.Model):
    image = models.ImageField(upload_to='uploads/')

在 forms.py 中:

from django import forms
from .models import Image

class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ['image']

在views.py中:

from django.shortcuts import render, redirect
from .forms import ImageForm

def upload_image(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('index')
        else:
            form = ImageForm()

    return render(request, 'upload_file.html', {'form': form})
4

1 回答 1

6

Django 默认存储类方法称为get_available_name

    # If the filename already exists, add an underscore and a random 7
    # character alphanumeric string (before the file extension, if one
    # exists) to the filename until the generated filename doesn't exist.
    # Truncate original name if required, so the new filename does not
    # exceed the max_length.

默认情况下,Django 按其名称保存对象,但如果具有该名称的对象已经存在,则添加下划线和代码注释中引用的 7 个随机字符

此外,作为此 Django 存储类方法的补充,get_valid_name 解析之前的文件名并用下划线替换所有空格并删除所有非 unicode、alpha、dash、下划线或点的字符

re.sub(r'(?u)[^-\w.]', '', s)
于 2017-02-15T19:58:16.257 回答