我正在创建REST API,但在Django中我并不特别精明。我想发布上传的文件,但在此之前,我想创建文件的sha256
,如下所示:
def sha256sum(filename):
h = hashlib.sha256()
b = bytearray(128*1024)
mv = memoryview(b)
with open(filename, 'rb', buffering=0) as f:
for n in iter(lambda : f.readinto(mv), 0):
h.update(mv[:n])
return h.hexdigest()
为了使它起作用,我需要实际的文件(或文件路径),而不是实际的文件名。我在viewsets.py中的代码:
def create(self, request):
serializer = FileSerializer(data=request.data)
f = request.FILES["file"] # just gives the filename
print(request.META)
if serializer.is_valid():
f = serializer.save()
print(f"f: {f}")
res_name = sha256sum(f)
print(f"res_name: {res_name}")
return Response(serializer.data, status=status.HTTP_201_CREATED)
有什么想法我要去哪里吗?
我有request.FILES ['file']是一个InMemoryUploadedFile。挖了几下之后,似乎这个文件已经“打开”了,所以我只是从函数中删除了打开,就像这样:
def sha256sum(filename):
h = hashlib.sha256()
b = bytearray(128*1024)
mv = memoryview(b)
for n in iter(lambda : filename.readinto(mv), 0):
h.update(mv[:n])
return h.hexdigest()