Хеширование файла в DRF (запрос POST HTTP) - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю 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)

Есть идеи, где я ошибаюсь?

1 Ответ

0 голосов
/ 16 апреля 2020

У меня был запрос. ФАЙЛЫ ['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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...