2016-02-10 1 views
0

J'écris une page de téléchargement de fichiers avec Django/Python. Je reçois cette erreur: FileNotFoundError: [Errno 2] Aucun fichier ou répertoire: '48 .png '.Pourquoi est-ce que je reçois "FileNotFoundError" quand je fileupload avec Django?

Voici la partie pertinente de la vue, qui gère le téléchargement.

`if request.method == 'POST': 
    form = myform(request.POST, request.FILES) 
    if form.is_valid(): 
     print("FORM VALID") 
     f = request.FILES['thefile'] 
     print("f:" + f.name) 
     print(pref+'/'+str(f)) 
     open(f.name, 'rb') 
    else: 
     print('FORM NOT VALID') 

Les choses vont mal à l'air libre (déclaration f.name Le formulaire est dans un modèle:

<form method="post" action="/dataset_storage_upload/{{ pk }}/{{pid}}/"  name="submit" enctype="multipart/form-data"> 
{% csrf_token %} 
{{ theForm.as_p }} 
<button type="start_upload" value="Submit" onclick="document.upload.submit() ">Upload</button> 
</form> 

et c'est la forme:

class myform(forms.Form): 
thefile = forms.FileField() 

Je ces informations dans la console

FORM VALID 
f:48.png 
/17/3/48.png 

(/ 17/3 est le préfixe)

Dans le retraçage, dans le navigateur, sous vars locaux, j'ai ceci:

pref '/17/3' 
mylist[] 
f <InMemoryUploadedFile: 48.png (image/png)> 
pk '17' 
form <myform bound=True, valid=True, fields=(thefile)> 
request<WSGIRequest: POST '/dataset_storage_upload/17/3/'> 

Je pense que cela me dit qu'il ya un fichier 48.png en mémoire. Alors pourquoi n'est-il pas là quand je l'ouvre?

Un grand merci pour votre attention.

Répondre

0

C'est seulement là en mémoire, pas sur le système de fichiers actuel. Les objets Django File fournissent un wrapper autour des fichiers réels et des fichiers en mémoire. Par exemple, si vous manipulez un fichier provenant d'un FileField sur un modèle, ce que vous faites fonctionnerait, mais le fichier que vous manipulez n'existe pas encore sur le système.

Si vous voulez lire le fichier dans votre vue, vous pouvez simplement appeler File.read:

f = request.FILES['thefile'] 
contents = f.read() 
+0

Je vous remercie CUM. h, ça marche parfaitement –

0

By default, if an uploaded file is smaller than 2.5 megabytes, Django will hold the entire contents of the upload in memory. This means that saving the file involves only a read from memory and a write to disk and thus is very fast.

0

j'ai changé f.open (en f.read (et maintenant il fonctionne parfaitement pour être complet. : Mon but est de stocker le fichier téléchargé dans S3, de sorte que maintenant je

s3.Object('mybucket', str(pk)+'/'+str(p)+'/'+str(f)).put(Body=f.read(),Metadata={'project': '17','dataset':'3','filename':str(f)}) 

et cela fonctionne