在Django Rest Framework中上传文件并处理zip请求



我很难知道如何在Django Rest Framework中处理来自上传文件的HTTP请求。我的视图中的create端点.py:

def create(self, request):
file_iobytes = request.FILES["file"].file
self.zipping(file_iobytes)
serializer = FileSerializer(data=request.data) # converts to JSON
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

def zipping(self, file):
# Create a buffer to write the zipfile into
zip_buffer = io.BytesIO()
# Create the zipfile, giving the buffer as the target
with zipfile.ZipFile(zip_buffer, 'w') as zip_file:
#file.seek(0)
zip_file.write(file)
file.close()

型号.py

class File(models.Model):
file = models.FileField(upload_to='Myfiles/')
...
def __str__(self):
return self.file.name

序列化程序.py

class FileSerializer(serializers.ModelSerializer):
class Meta:
model = File
fields = '__all__'
read_only_fields = ('timestamp',)

我的意图是:

  1. 通过DRF上传文件
  2. 从文件例如sha1创建散列(我不知道如何直接创建,因为散列需要一个路径,我也不知道如何从http请求中检索这个路径(
  3. 压缩文件并存储

如何使用请求创建zip文件(这是正确的方法吗(?

我希望这些评论是不言自明的:(

import hashlib
from rest_framework.decorators import api_view
from rest_framework.response import Response

def generate_sha1(file_pointer):
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536  # lets read stuff in 64kb chunks!
sha1 = hashlib.sha1()
while True:
data = file_pointer.read(BUF_SIZE)
if not data:
break
sha1.update(data)
return sha1.hexdigest()

def generate_zip(model_instance):
source_file = f'{model_instance.file.name}'
dest_file = f'{source_file}.zip'
zipfile.ZipFile(dest_file, mode='w').write(source_file)
return dest_file

def re_assign_files(model_instance, dest_file):
model_instance.file.delete()  # deletes the uploaded file
model_instance.file = dest_file  # mapping the generated zip file
model_instance.save()  # saving the model instance

@api_view(http_method_names=['GET', 'POST'])
def foo_api(request):
if request.method == 'GET':
return Response({'message': 'this is get method'})
else:
serializer = FileSerializer(data=request.data)
serializer.is_valid(True)  # validating the data
model_instance = serializer.save()  # saving the data into database
hash_sha1 = generate_sha1(serializer.validated_data['file'])  # generates the SHA1 value
dest_file = generate_zip(model_instance)  # generates zip file
re_assign_files(model_instance, dest_file)
return Response({'sha1': hash_sha1, 'data': serializer.data})

最新更新