J'ai un morceau de code qui obtient un fichier d'un formulaire via POST.
file = request.FILES['f']
Quelle serait la façon la plus simple d'enregistrer ce fichier dans mon dossier multimédia dans
settings.MEDIA_ROOT
Je regardais cette réponse , entre autres, mais j'ai eu des erreurs se référant à des noms indéfinis et à une méthode de "morceaux" non valide.
Il doit y avoir un moyen simple de le faire?
[~ # ~] modifier [~ # ~] Méthode de téléchargement dans mon views.py:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['f'].name
# create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(settings.MEDIA_ROOT, folder))
except:
pass
# save the uploaded file inside that folder.
full_filename = os.path.join(settings.MEDIA_ROOT, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
file_content = ContentFile( request.FILES['f'].read() )
# Iterate through the chunks.
for chunk in file_content.chunks():
fout.write(chunk)
fout.close()
En utilisant default_storage
est meilleur que FileSystemStorage
.
Vous pouvez enregistrer le fichier dans MEDIA_ROOT
avec FileSystemStorage
mais lorsque vous modifiez DEFAULT_FILE_STORAGE
backend à l'avenir, cela pourrait ne plus fonctionner.
Si tu utilises default_storage
, à l'avenir si vous souhaitez utiliser aws, Azure, etc. comme magasin de fichiers avec plusieurs Django travailleur votre code fonctionnera sans aucune modification.
exemple d'utilisation de default_storage:
from Django.core.files.storage import default_storage
# Saving POST'ed file to storage
file = request.FILES['myfile']
file_name = default_storage.save(file.name, file)
# Reading file from storage
file = default_storage.open(file_name)
file_url = default_storage.url(file_name)
vous pouvez télécharger des fichiers sur le serveur Django::
from Django.shortcuts import render
from Django.conf import settings
from Django.core.files.storage import FileSystemStorage
def upload(request):
folder='my_folder/'
if request.method == 'POST' and request.FILES['myfile']:
myfile = request.FILES['myfile']
fs = FileSystemStorage(location=folder) #defaults to MEDIA_ROOT
filename = fs.save(myfile.name, myfile)
file_url = fs.url(filename)
return render(request, 'upload.html', {
'file_url': file_url
})
else:
return render(request, 'upload.html')
Vous pouvez utiliser Django FileField
, il prend en charge spécifier un upload_to
paramètre, comme ceci:
data_file = models.FileField(upload_to=content_path)
Où content_path
peut être une chaîne ou une fonction qui renvoie une chaîne.
Utilisez le code suivant pour mettre à jour un FileField
ou ImageField
. Django téléchargera le fichier sur settings.MEDIA_ROOT
par défaut.
from os.path import basename
from Django.core.files import File
self.model.file_field.save(basename(path), content=File(open(path, 'rb')))
Afterwords vous pouvez accéder:
Le chemin comme celui-ci:
self.model.file_field.path
L'URL comme ceci:
self.model.file_field.url