Как принять путь в 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
.