maximkv25
@maximkv25
web-developer

Как найти путь к файлу и исправить экранирование?

def upload_file(request):
    if request.method == 'POST':
        file = request.FILES['data']
        extension = file_type(file)
        new_name = 'test_name' + '.' + extension

        destination = open('C:\\photo\\' + new_name, 'wb+')
        k = str(destination)
        file_path = k[26:-2]

        for chunk in file.chunks():
            destination.write(chunk)
            destination.close()
        return JsonResponse({
            'file_path': file_path,
        })

Добрый день, каким методом можно получить путь к файлу, если он лежит в определенной директории?
Как в примере выше, сохраняю файл и сразу получить его полный путь, а не таким ужасным способом как у меня.
Еще при передачи строки пути файла в json формате добавляется дополнительное экранирование, C:\\\\photo\\\\, как можно это исправить?
def file_type(file):
    return ".".join(file.name.split('.')[-1:])

Есть ли метод, который поможет узнать расширение файла?
Данный метод не хочет сохранять файлы расширений zip,py и т.д. С чем это связано?

Заранее спасибо за вашу помощь и советы)
  • Вопрос задан
  • 563 просмотра
Решения вопроса 1
Ba1t
@Ba1t
Есть ли метод, который поможет узнать расширение файла?

import os

destination = open('C:\\photo\\' + new_name, 'wb+')
# не делайте так...
# k = str(destination)
# file_path = k[26:-2]

filename = destination.name # имя файла
filepath = os.path.abspath(filename) # полный путь к файлу
file_extension = os.path.splitext(filename)[1] # вернется кортеж: [0] - имя файла, [1] - расширение

Данный метод не хочет сохранять файлы расширений zip,py и т.д. С чем это связано?

Вы закрываете файловый дескриптор после записи первого чанка:
for chunk in file.chunks():
    destination.write(chunk)
    destination.close()

Если файл больше чем размер одного чанка (предположительно 4096 байт), то он конечно не запишется в файл полностью.
Вынесите destination.close() за цикл. А еще лучше работайте с файлом через менеджер контекста:
with open('C:\\photo\\' + new_name, 'wb+') as destination:
    for chunk in file.chunks():
        destination.write(chunk)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы