我很难知道如何在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',)
我的意图是:
- 通过DRF上传文件
- 从文件例如sha1创建散列(我不知道如何直接创建,因为散列需要一个路径,我也不知道如何从http请求中检索这个路径(
- 压缩文件并存储
如何使用请求创建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})