欢迎光临
我们一直在努力

Django中如何将图片上传并存储到服务器?

Django 图片上传到服务器

Django中如何将图片上传并存储到服务器?

一、Django 项目设置

安装 Pillow

为了处理图片,我们需要安装 Pillow,在命令行中输入以下命令:

pip install pillow

配置 settings.py

在项目的settings.py 文件中,进行如下配置:

settings.py
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
MEDIA_URL = '/media/'
允许的文件类型和最大文件大小(单位:字节)
MEDIA_ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif']
MEDIA_MAX_SIZE = 10485760  # 10MB

配置 urls.py

在项目的urls.py 文件中,添加一条 URL 规则来处理媒体文件的访问请求:

Django中如何将图片上传并存储到服务器?

urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
urlpatterns = [
    # ...其他URL模式...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

二、定义模型类

创建模型类

在应用的models.py 文件中,定义一个模型类来保存图片信息:

models.py
from django.db import models
class ImageModel(models.Model):
    imgName = models.CharField(max_length=252, default="", verbose_name="文件名")
    imgMd5 = models.CharField(max_length=128, verbose_name="MD5值")
    imgType = models.CharField(max_length=32, verbose_name="类型")
    imgSize = models.IntegerField(verbose_name="大小")
    imgPath = models.CharField(max_length=128, verbose_name="图片路径")
    imgCreated = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    # imgUpdated = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    def __str__(self):
        return self.imgName
    class Meta:
        db_table = 'uploadImage'

迁移数据库

执行以下命令以迁移数据库:

python manage.py makemigrations
python manage.py migrate

三、编写视图函数

Django中如何将图片上传并存储到服务器?

创建工具方法

在应用的tools.py 文件中,创建一些工具方法来处理文件操作:

tools.py
import os
import time
import random
import hashlib
from django.conf import settings
from datetime import datetime
from uuid import uuid1
def GetFileMd5(file):
    md5Obj = hashlib.md5()
    for chunk in file.chunks():
        md5Obj.update(chunk)
    return md5Obj.hexdigest()
def Rename(file):
    times = time.strftime('%Y%m%d%H%M%S')
    ran = random.randint(0, 1000)
    ext = os.path.splitext(file.name)[1]
    newfile = f"{times}{ran}{ext}"
    path = os.path.join('media', newfile).replace('\\', '/')
    with open(path, 'wb+') as read:
        for chunk in file.chunks():
            read.write(chunk)
    return path
def JudgeType(ext):
    ImageType = [".png", ".jpeg", ".jpg", ".gif", ".bmp"]
    return ext in ImageType
def FileSize(size):
    limit = settings.MEDIA_MAX_SIZE
    return size < limit

编写视图函数

views.py 文件中,编写视图函数来处理图片上传请求:

views.py
from django.shortcuts import render, redirect, HttpResponse
from django.http import JsonResponse
from .models import ImageModel
from .tools import GetFileMd5, Rename, JudgeType, FileSize
import json
import uuid
from django.conf import settings
from django.core.files.images import ImageFile
from PIL import Image as PilImage
import io
import base64
from django.utils.text import slugify
import os
import mimetypes
from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.core.exceptions import SuspiciousOperation, SuspiciousFileOperation
import logging
from pathlib import PurePosixPath
import tempfile
import shutil
from django.core.files.uploadedfile import SimpleUploadedFile, InMemoryUploadedFile, TemporaryUploadedFile,, import_module
from django.utils.encoding import force_bytes, escape_string, escape_uri_path, force_str, smart_str, smart_unicode, uri_path, is_protected_type
from django.utils.http import urlquote, multipart_guard, query_string_remove_decode_plus, parse_qsl, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse_qs, parse_qsl, urlquote, urlencode, is_safe_string, is_safe_urlstring, http_date, cookie_date, parse_etags, is_ascii, is_media_type, parse_headers, parse_etags_list, parse qs, parse qsl, url quote, url encode, is safe string, is safe url string, http date, cookie date, parse e tags, is ascii i s media type 解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 解码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表、解析查询字符串、解析查询参数列表、URL 编码、URL 编码、安全字符串检查、安全 URL 字符串检查、HTTP 日期解析、Cookie 日期解析、解析 etag、是否为 ASCII、是否为媒体类型、解析头部、解析 etag 列表等方法,这些方法用于处理文件上传的各种需求,如获取文件 MD5,重命名文件,检测文件类型,限制文件大小等,通过这些方法,我们可以确保文件的安全性和正确性,我们还可以使用这些方法来优化文件上传的性能和用户体验,我们可以通过计算文件的 MD5 来避免重复上传相同的文件,从而提高系统的效率,我们还可以通过限制文件的大小来防止用户上传过大的文件,从而保护系统的稳定性,这些方法为我们提供了丰富的功能来处理文件上传的各种需求。

各位小伙伴们,我刚刚为大家分享了有关“Django怎么把图片放到服务器”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Django中如何将图片上传并存储到服务器?》
文章链接:https://yuyunkj.com/article/9618.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发