2010-09-13 7 views
28

मैं फ़ॉर्म के साथ भेजी गई फ़ाइल को पकड़ने की कोशिश कर रहा हूं और इसे सहेजने से पहले कुछ संचालन करने की कोशिश कर रहा हूं। तो मुझे temp निर्देशिका में इस फ़ाइल की एक प्रति बनाने की आवश्यकता है, लेकिन मुझे नहीं पता कि इसे कैसे पहुंचाया जाए। शटल के फ़ंक्शन इस फ़ाइल की प्रतिलिपि बनाने में विफल रहते हैं, क्योंकि इसमें कोई रास्ता नहीं है। तो क्या इस ऑपरेशन को किसी अन्य तरीके से करने का कोई तरीका है?डिस्क में InMemoryUploadedFile ऑब्जेक्ट को कॉपी करने के लिए कैसे करें

मेरे कोड:

image = form.cleaned_data['image'] 
    temp = os.path.join(settings.PROJECT_PATH, 'tmp') 
    sourceFile = image.name # without .name here it wasn't working either 
    import shutil 
    shutil.copy(sourceFile, temp) 

कौन सा उठता है:

Exception Type: IOError at /
Exception Value: (2, 'No such file or directory')

और डिबग:

# (..)\views.py in function 

    67. sourceFile = image.name 
    68. import shutil 
    69. shutil.copy2(sourceFile, temp) ... 

# (..)\Python26\lib\shutil.py in copy2 

    92. """Copy data and all stat info ("cp -p src dst"). 
    93. 
    94. The destination may be a directory. 
    95. 
    96. """ 
    97. if os.path.isdir(dst): 
    98. dst = os.path.join(dst, os.path.basename(src)) 
    99. copyfile(src, dst) ... 
100. copystat(src, dst) 
101. 

▼ Local vars 
Variable Value 
dst  
u'(..)\\tmp\\myfile.JPG' 
src  
u'myfile.JPG' 
# (..)\Python26\lib\shutil.py in copyfile 

    45. """Copy data from src to dst""" 
    46. if _samefile(src, dst): 
    47. raise Error, "`%s` and `%s` are the same file" % (src, dst) 
    48. 
    49. fsrc = None 
    50. fdst = None 
    51. try: 
    52. fsrc = open(src, 'rb') ... 
    53. fdst = open(dst, 'wb') 
    54. copyfileobj(fsrc, fdst) 
    55. finally: 
    56. if fdst: 
    57. fdst.close() 
    58. if fsrc: 

▼ Local vars 
Variable Value 
dst  
u'(..)\\tmp\\myfile.JPG' 
fdst  
None 
fsrc  
None 
src  
u'myfile.JPG' 

उत्तर

39

This समान प्रश्न है, यह मदद कर सकता है है।

### get the inmemory file 
data = request.FILES.get('file') # get the file from the curl 

### write the data to a temp file 
tup = tempfile.mkstemp() # make a tmp file 
f = os.fdopen(tup[0], 'w') # open the tmp file for writing 
f.write(data.read()) # write the tmp file 
f.close() 

### return the path of the file 
filepath = tup[1] # get the filepath 
return filepath 
+0

हाय, मुझे लगता है कि "tmp/name.mp3" हार्डकोड किया गया है, यह क्रॉस प्लेटफ़ॉर्म पथ में एक समस्या होगी, मैं आपके कोड को सुधारने का प्रयास करता हूं

 from django.conf import settings tmp = os.path.join(settings.MEDIA_ROOT, "tmp", data.name) path = default_storage.save(tmp, ContentFile(data.read()))

+2

मुझे यहां पसंद नहीं है ** data.read() ** –

+0

@ ups.read() के साथ क्या गलत है ?? –

5

आपका सर्वोत्तम कदम एक कस्टम अपलोड हैंडलर लिखने के लिए है। docs देखें। यदि आप "file_complete" हैंडलर जोड़ते हैं, तो आप मेमोरी फ़ाइल या अस्थायी पथ फ़ाइल के बावजूद फ़ाइल की सामग्री तक पहुंच सकते हैं। आप "get_data_chunck" विधि का भी उपयोग कर सकते हैं और अपनी प्रतिलिपि इसके भीतर लिख सकते हैं।

सादर

+0

मैं इसे थोड़ी देर के लिए उपयोग कर रहा था जब तक कि एक डुप्लिकेट नाम अपलोड नहीं किया जाता है और django स्वचालित रूप से फ़ाइल नाम अद्वितीय बनाने के लिए एक प्रत्यय जोड़ता है। उस नामित फ़ाइल नाम अपलोड हैंडलर स्तर पर उपलब्ध नहीं था। इसके अलावा यह बहुत साफ ढंग से काम किया। – awwester

1

यहाँ एक और तरीका अजगर के mkstemp साथ यह करने के लिए है।

Django docs से

:

Looping over UploadedFile.chunks() instead of using read() ensures that large files don't overwhelm your system's memory

from django.core.files.storage import default_storage 

filename = "whatever.xyz" # received file name 
file_obj = request.data['file'] 

with default_storage.open('tmp/'+filename, 'wb+') as destination: 
    for chunk in file_obj.chunks(): 
     destination.write(chunk) 

यह जब तक अन्यथा कहा था अपने default_storage इच्छा के रूप में MEDIA_ROOT/tmp/ पर फ़ाइल बचत होगी।

7

@ups से उल्लेख किया है, जब बड़े फ़ाइल अपलोड करना, आप नहीं एक data.read() साथ सिस्टम स्मृति को अवरुद्ध करना चाहते हैं:

import os 
from django.core.files.storage import default_storage 
from django.core.files.base import ContentFile 
from django.conf import settings 

data = request.FILES['image'] # or self.files['image'] in your form 

path = default_storage.save('tmp/somename.mp3', ContentFile(data.read())) 
tmp_file = os.path.join(settings.MEDIA_ROOT, path) 
+0

इस तरह मुझे मिलता है: FileNotFoundError: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं: '//<मेरी छवि का नाम> .png'। विचार? – Daviddd

+0

@Daviddd फ़ाइल वह जगह नहीं है जहां आप सोचते हैं, और यह इस कोड के लिए अप्रासंगिक है। –

संबंधित मुद्दे

 संबंधित मुद्दे