如何在Python中保存临时文件?Django GIS应用场景需求
在Django中保存上传的Shapefile临时文件到本地
在Django开发场景下,上传的文件会以InMemoryUploadedFile或TemporaryUploadedFile类型存在,你可以通过文件对象的读写方法直接将其保存到本地系统,以下是两种实用实现方式:
1. 通过Serializer处理上传时保存
假设你已经定义了包含FileField的模型,可在序列化器的create方法中完成本地保存:
# models.py from django.db import models class ShapefileUpload(models.Model): shp_file = models.FileField(upload_to='temp_shp/')
# serializers.py from rest_framework import serializers from .models import ShapefileUpload import os import shutil class ShapefileUploadSerializer(serializers.ModelSerializer): class Meta: model = ShapefileUpload fields = ['shp_file'] def create(self, validated_data): shp_file = validated_data.get('shp_file') # 定义本地保存路径(示例为项目根目录下的local_shp文件夹) save_dir = os.path.join(os.getcwd(), 'local_shp') os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, shp_file.name) # 用shutil快速拷贝文件内容到本地 with open(save_path, 'wb+') as local_file: shutil.copyfileobj(shp_file, local_file) # 继续创建模型实例(若需同时将文件存入Django的media目录) return super().create(validated_data)
2. 在视图中直接处理上传文件
如果无需经过序列化器,可在视图中直接读取request.FILES并保存:
# views.py from django.http import HttpResponse import os import shutil def upload_shp_view(request): if request.method == 'POST' and 'shp_file' in request.FILES: shp_file = request.FILES['shp_file'] save_dir = os.path.join(os.getcwd(), 'local_shp') os.makedirs(save_dir, exist_ok=True) save_path = os.path.join(save_dir, shp_file.name) # 逐块写入文件(适合大文件上传) with open(save_path, 'wb+') as local_file: for chunk in shp_file.chunks(): local_file.write(chunk) return HttpResponse("Shapefile已保存到本地") return HttpResponse("文件上传失败")
关键注意事项
- 确保目标保存目录具备写入权限,否则会抛出权限异常。
- 若上传的是完整Shapefile包(包含.shp/.shx/.dbf等多个文件),需遍历
request.FILES中的每个文件,分别执行保存操作。 - 大文件上传时,优先使用
chunks()逐块写入,避免内存溢出。
内容的提问来源于stack exchange,提问作者Emad Modaresi
相关产品推荐
相关产品推荐

