如何阅读请求.将FILES放入Geodjango中的DataSource中



因此,目标是创建一个网页,将.shp文件加载到其中,并将一些计算的摘要作为JsonResponse获取。我已经准备好了计算和所有内容,当我为有问题的文件添加手动路径时,它运行得很好。然而,目标是让其他人能够上传数据并返回响应,这样我就不能硬编码我的路径。

总体方法:

  • 通读表格。FileField((和请求。FILES["文件名"]。在此之后,我需要转移此请求。FILES对象到DataSource以便读取它。如果可能的话,我宁愿不在pc上上传文件,而是直接从内存中工作

forms.py

from django import forms
from django.core.files.storage import FileSystemStorage

class UploadFileForm(forms.Form):
# title = forms.CharField(max_length=50)
file = forms.FileField()

views.py

import json
import os
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.template import loader
from django.contrib import messages
from django.views.generic import TemplateView
from django.http import JsonResponse
from django.conf import settings
from .forms import UploadFileForm
from . import models
from django.shortcuts import redirect
from gisapp.functions.functions import handle_uploaded_file, handle_uploaded_file_two
from django.contrib.gis.gdal import DataSource
from django.core.files.uploadedfile import UploadedFile, TemporaryUploadedFile
import geopandas as gpd
import fiona

def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
f = request.FILES['file']
# geo2 = gpd.read_file(f)
# print(geo2)
# f_path = os.path.abspath(os.path.join(os.path.dirname(f), f))
# f_path = TemporaryUploadedFile.temporary_file_path(UploadedFile(f))
# print(f_path)
# f_path = f.temporary_file_path()
# new_path =  request.FILES['file'].temporary_file_path
# print(f'This is file path: {f_path}')
# print(f'This is file path: {new_path}')
# data = DataSource(f'gisapp/data/{f}') -- given an absolute path it works great
data = DataSource(f) -- constantly failing
# data = DataSource(new_path)
# print(f'This is file path: {f_path}')
layer = data[0]
if layer.geom_type.name == "Polygon" or layer.geom_type.name == "LineString":
handle_uploaded_file(request.FILES['file'])
elif layer.geom_type.name == "Point":
handle_uploaded_file_two(request.FILES['file'])
return JsonResponse({"Count": f"{handle_uploaded_file_two(request.FILES['file'])[0]}", "Bounding Box": f"{handle_uploaded_file_two(request.FILES['file'])[1]}"})

# return JsonResponse({"Count": f"{handle_uploaded_file(request.FILES['file'])[0]}", "Minimum": f"{handle_uploaded_file(request.FILES['file'])[1]}", "Maximum": f"{handle_uploaded_file(request.FILES['file'])[1]}"})
# instance = models.GeometryUpload(file_field=request.FILES['file'])
# instance.save()
# # return HttpResponseRedirect('/success/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})

我得到的错误:

django.contrib.gis.gdal.error.GDALException: Invalid data source input type: <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

现在,您可以从views.py中的upload_file((中看到,我尝试了许多操作,当我添加一个绝对路径时,它是有效的,但除此之外,我似乎无法将文件上传到DataSource,以便在以后的分析中使用它。

看看Django是如何处理这一问题的,似乎不可能处理内存中的文件。文件的路径被传递给OGR的C API,然后OGR处理打开文件并在.中读取它

我自己尝试的一个可能的解决方案是让用户预先压缩他们的形状文件(.shp、.shx.、dbf等(。然后上传并解压缩zip文件。然后可以读取shp文件。希望这能帮助

我面临同样的问题,我的解决方法是将用户上传的文件保存在一个临时文件夹中,然后将临时文件的绝对路径传递到我的DataSource。在用临时文件完成所有过程后,我删除了。

这种方法的缺点是执行时间慢。

最新更新