फ़ाइल डेटा को फ्लास्क में सहेजे बिना पढ़ें


112

मैं अपना पहला फ्लास्क एप्लिकेशन लिख रहा हूं। मैं फ़ाइल अपलोड के साथ काम कर रहा हूं, और मूल रूप से जो मैं चाहता हूं वह अपलोड किए गए फ़ाइल के डेटा / सामग्री को बिना सहेजे पढ़ना है और फिर परिणामी पृष्ठ पर इसे प्रिंट करना है। हां, मैं यह मान रहा हूं कि उपयोगकर्ता हमेशा एक पाठ फ़ाइल अपलोड करता है।

यहाँ सरल अपलोड फ़ंक्शन है जिसका मैं उपयोग कर रहा हूँ:

@app.route('/upload/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            a = 'file uploaded'

    return render_template('upload.html', data = a)

अभी, मैं फ़ाइल को सहेज रहा हूं, लेकिन मुझे जो चाहिए वह है 'a' वैरिएबल जिसमें फ़ाइल की सामग्री / डेटा शामिल है .. कोई विचार?

जवाबों:


137

FileStoragestreamक्षेत्र शामिल हैं। इस ऑब्जेक्ट को IO या फ़ाइल ऑब्जेक्ट का विस्तार करना होगा, इसलिए इसमें readऔर अन्य समान तरीके होने चाहिए। फ़ील्ड ऑब्जेक्ट विशेषताओं FileStorageका भी विस्तार करें stream, ताकि आप file.read()इसके बजाय बस उपयोग कर सकें file.stream.read()। इसके अलावा, आप अन्य IO या फ़ाइल ऑब्जेक्ट पर प्रतिलिपि करने के लिए पैरामीटर के रूप में या अन्य IO या फ़ाइल ऑब्जेक्ट के saveसाथ तर्क का उपयोग कर सकते हैं ।dstStringIOFileStorage.stream

प्रलेखन देखें: http://flask.pocoo.org/docs/api/#flask.Request.files और http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastroures.FileStorage


1
त्वरित उदाहरण:file = request.files.get('file') filetype = magic.from_buffer(file.read(1024))
२०

7
hi @ user2480542 मैं उसी समस्या में भाग रहा हूं। क्या आप वर्णन कर सकते हैं कि आपने क्लाइंट-अपलोड की गई फ़ाइल की सामग्री को पढ़ने के बारे में कैसे जाना? मैं file.read () कॉल कर रहा हूं, लेकिन मुझे कुछ नहीं मिल रहा है। धन्यवाद!
tmthyjames

1
@tmthyjames f = request.files['file']ने var ("f") में अपलोड की गई फ़ाइल (अनुरोध में) डाल दी। फिर f.read()उपरोक्त कोड का उपयोग करके काम करता है। जब print f.read()मैं सही लग रही हूँ टर्मिनल में कबाड़। उम्मीद है की वो मदद करदे।
मार्क

6
यदि आप एक फ़ाइल अपलोड कर रहे हैं और एक बाइनरी स्ट्रीम है, तो आप इसे TextIOWrapper में रैप करके आसानी से टेक्स्ट स्ट्रीम में बदल सकते हैं: mystring = TextIOWrapper(binary_stream)
डच मास्टर्स

6
f.read()मेरे लिए भी कुछ नहीं उपज। कॉलिंग f.seek(0)ने पहले मेरे लिए टोटका किया।
w177us

11

यदि आप मानक फ्लास्क सामान का उपयोग करना चाहते हैं - अपलोड की गई फ़ाइल का आकार> 500kb है तो अस्थायी फ़ाइल को सहेजने से बचने का कोई तरीका नहीं है। यदि यह 500kb से छोटा है - यह "बाइट्सियो" का उपयोग करेगा, जो फ़ाइल सामग्री को मेमोरी में संग्रहीत करता है, और यदि यह 500kb से अधिक है - तो यह सामग्री को TemporaryFile () (जैसा कि werkzeug प्रलेखन में कहा गया है) संग्रहीत करता है । दोनों मामलों में आपकी स्क्रिप्ट तब तक ब्लॉक रहेगी जब तक अपलोड की गई फ़ाइल की संपूर्णता प्राप्त नहीं हो जाती।

इसके आसपास काम करने का सबसे आसान तरीका जो मुझे मिला है वह है:

1) अपनी खुद की फ़ाइल की तरह IO क्लास बनाएँ जहाँ आप आने वाले डेटा की सारी प्रोसेसिंग करते हैं

2) आपकी स्क्रिप्ट में, अपने स्वयं के साथ अनुरोध वर्ग को ओवरराइड करें:

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )

3) अपने स्वयं के साथ फ्लास्क के अनुरोध को बदलें:

app.request_class = MyRequest

4) गो कुछ बियर है :)


0

मैं एक ही बात करने की कोशिश कर रहा था, एक पाठ फ़ाइल खोलें (पंडों के लिए एक सीएसवी वास्तव में)। इसकी प्रति नहीं बनाना चाहते, बस इसे खोलना चाहते हैं। फॉर्म-डब्ल्यूटीएफ में एक अच्छा फ़ाइल ब्राउज़र है, लेकिन फिर यह फ़ाइल को खोलता है और एक अस्थायी फ़ाइल बनाता है, जिसे यह मेमोरी स्ट्रीम के रूप में प्रस्तुत करता है। हुड के नीचे एक छोटे से काम के साथ,

form = UploadForm() 
 if form.validate_on_submit(): 
      filename = secure_filename(form.fileContents.data.filename)  
      filestream =  form.fileContents.data 
      filestream.seek(0)
      ef = pd.read_csv( filestream  )
      sr = pd.DataFrame(ef)  
      return render_template('dataframe.html',tables=[sr.to_html(justify='center, classes='table table-bordered table-hover')],titles = [filename], form=form) 

0

मैं अपना समाधान साझा करता हूं (यह मानते हुए कि फ्लास्क में Google बकेट से कनेक्ट करने के लिए सब कुछ पहले से ही कॉन्फ़िगर है)

from google.cloud import storage

@app.route('/upload/', methods=['POST'])
def upload():
    if request.method == 'POST':
        # FileStorage object wrapper
        file = request.files["file"]                    
        if file:
            os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = app.config['GOOGLE_APPLICATION_CREDENTIALS']
            bucket_name = "bucket_name" 
            storage_client = storage.Client()
            bucket = storage_client.bucket(bucket_name)
            # Upload file to Google Bucket
            blob = bucket.blob(file.filename) 
            blob.upload_from_string(file.read())

मेरा पद

फ्लास्क में Google बकेट के लिए प्रत्यक्ष


-1

यदि हम डिस्क में मेमोरी फाइल को डंप करना चाहते हैं। इस कोड का उपयोग किया जा सकता है

  if isinstanceof(obj,SpooledTemporaryFile):
    obj.rollover()

-1

हमने बस किया:

import io
from pathlib import Path

    def test_my_upload(self, accept_json):
        """Test my uploads endpoint for POST."""
        data = {
            "filePath[]": "/tmp/bin",
            "manifest[]": (io.StringIO(str(Path(__file__).parent /
                                           "path_to_file/npmlist.json")).read(),
                           'npmlist.json'),
        }
        headers = {
            'a': 'A',
            'b': 'B'
        }
        res = self.client.post(api_route_for('/test'),
                               data=data,
                               content_type='multipart/form-data',
                               headers=headers,
                               )
        assert res.status_code == 200

-1

समारोह में

def handleUpload():
    if 'photo' in request.files:
        photo = request.files['photo']
        if photo.filename != '':      
            image = request.files['photo']  
            image_string = base64.b64encode(image.read())
            image_string = image_string.decode('utf-8')
            #use this to remove b'...' to get raw string
            return render_template('handleUpload.html',filestring = image_string)
    return render_template('upload.html')

html फाइल में

<html>
<head>
    <title>Simple file upload using Python Flask</title>
</head>
<body>
    {% if filestring %}
      <h1>Raw image:</h1>
      <h1>{{filestring}}</h1>
      <img src="data:image/png;base64, {{filestring}}" alt="alternate" />.
    {% else %}
      <h1></h1>
    {% endif %}
</body>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.