Как принять путь в request.FILE['file'], чтобы поместить его для ссылки на скачивание

Я создаю foo для загрузки файлов в модели Django, его объект InMemoryUpload. и как я могу собрать полный путь к ссылке на загрузку?

my models.py

class Document(models.Model):
    """Class for uplaoded files. colect file and description
    working with analog form
    """
    id = models.AutoField(primary_key=True)
    file_path = models.TextField(max_length=255)
    hash_size = models.CharField(max_length=255)

    def __str__(self):
        return f"{self.id},{self.file_path},{self.hash_size}"

    def get_hash(file: object) -> str:
        md = hashlib.md5()
        # with open(file, "rb") as f:
        for chunk in iter(lambda: file.read(4096), b""):
            md.update(chunk)
        return md.hexdigest()

my views.py

def model_form_upload_1(request: HttpRequest) -> HttpResponse:
    ''' view handling this form will receive the file data in
:attr:`request.FILES <django.http.HttpRequest.FILES>`'''
    if request.method == 'POST':
        upload = request.FILES['file']
        path = upload.chunks()
        print(path)
        hash_tuple = ()
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            print(upload.size)
            if get_file_size(upload):
                hash = Document.get_hash(upload)
                hash_list = [x for x in Document.objects.all().values_list('hash_size')]
                hash_tuple += (hash,)
                if hash_tuple not in hash_list:
                    Document.objects.create(
                        file_path=request.GET.get(upload),
                        hash_size=hash)
                else:
                    return HttpResponseBadRequest("file bigger tha 300mb")
            return redirect("view")
        else:
            return HttpResponseBadRequest("Form invalid")
    else:
        form = DocumentForm()
        return render(
            request=request,
            template_name='model_form_upload.html',
            context={'form': form})
        return render(request, 'model_form_upload.html')
    return render(request, 'model_form_upload.html')

my template.py

    <tr>
        <td>{{document.id}}</td>
        <td>{{document.file_path}}</td>
        <td><a href="{{ document.file_path }}">download</a></td>
        <td>{{document.hash_size}}</td>
    </tr>

раньше я пытался взять request.open(file), но это не то, что мне нужно.

Вы должны установить MEDIA_ROOT и MEDIA_URL в settings.py. Как описано в официальных документах, по умолчанию загруженные файлы будут сохраняться из папок MEDIA_ROOT.

Например, предположим, что у вас есть следующий конфиг в settings.py:

MEDIA_ROOT = '/home/mysite/media/'

MEDIA_URL = '/media/'

Тогда вам нужно удалить location="/tmp" из FileSystemStorage (потому что по умолчанию location установлен в MEDIA_ROOT).

И добавьте this в URLconf для обслуживания статических файлов с помощью Django:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Итак, my_file.png будет обслуживаться следующим URL:

[IP or domain]/media/my_file.png

Это только для разработки env (DEBUG =True). В продакшене файлы должны обслуживаться веб-серверами типа Nginx.

Вернуться на верх