ফ্ল্যাস্কে ফাইল ডেটা সংরক্ষণ না করে পড়ুন


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)

এই মুহুর্তে, আমি ফাইলটি সংরক্ষণ করছি, তবে আমার কী দরকার যে ফাইলটির বিষয়বস্তু / ডেটা থাকতে একটি 'ভেরিয়েবল' .. কোনও ধারণা?

উত্তর:


137

FileStoragestreamক্ষেত্র রয়েছে এই অবজেক্টটি অবশ্যই IO বা ফাইল অবজেক্টকে প্রসারিত করতে হবে, সুতরাং এটিতে readএবং অন্যান্য অনুরূপ পদ্ধতি থাকতে হবে । ক্ষেত্র অবজেক্ট বৈশিষ্ট্যগুলিও FileStorageপ্রসারিত করুন stream, যাতে আপনি কেবল file.read()পরিবর্তে ব্যবহার করতে পারেন file.stream.read()। এছাড়াও আপনি প্যারামিটার হিসাবে saveআর্গুমেন্ট dstহিসাবে StringIOবা অন্য আইও বা ফাইল অবজেক্টের FileStorage.streamসাথে অন্য আইও বা ফাইল অবজেক্টে অনুলিপি করতে পারেন।

ডকুমেন্টেশন দেখুন: http://flask.pocoo.org/docs/api/#flask.Request.files এবং http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage


1
দ্রুত উদাহরণ:file = request.files.get('file') filetype = magic.from_buffer(file.read(1024))
এন্ডোলিথ

7
হাই @ user2480542। আমিও একই সমস্যায় পড়ছি। আপনি কীভাবে ক্লায়েন্ট-আপলোড করা ফাইলের সামগ্রীগুলি পড়তে গিয়ে বর্ণনা করতে পারেন? আমি ফাইল.আরড () কল করছি কিন্তু কিছুই পাচ্ছি না। ধন্যবাদ!
tmthyjames

1
@tmthyjames f = request.files['file']আপলোড করা ফাইলটি (অনুরোধে) একটি ভারে রাখে ("চ")। তারপরে f.read()উপরের কোডটি ব্যবহার করে কাজ করে। print f.read()আমি কখন টার্মিনালে সঠিক খুঁজছেন জাঙ্ক পাব। আশা করি এইটি কাজ করবে.
মার্ক

6
আপনি যদি কোনও ফাইল আপলোড করে থাকেন এবং একটি বাইনারি স্ট্রিম থাকে তবে আপনি সহজেই এটিকে টেক্সটআইওরাপারে আবদ্ধ করে একটি পাঠ্য স্ট্রিমে রূপান্তর করতে পারেন: mystring = TextIOWrapper(binary_stream)
ডাচ মাস্টার্স

6
f.read()আমার জন্যও কিছু দেয়নি। প্রথমে ফোন করা f.seek(0)আমার জন্য কৌশলটি করেছিল।
w177us

11

আপনি যদি স্ট্যান্ডার্ড ফ্লাস্ক স্টাফ ব্যবহার করতে চান - আপলোড করা ফাইলের আকার> 500 কেবি হয় তবে অস্থায়ী ফাইলটি এড়ানোর কোনও উপায় নেই। যদি এটি 500kb এর চেয়ে কম হয় - এটি "বাইটসআইও" ব্যবহার করবে, যা ফাইলের সামগ্রী মেমরিতে সংরক্ষণ করে এবং যদি এটি 500kb এর বেশি হয় - এটি টেম্পোরারি ফাইলে () ওয়ার্কজেগ ডকুমেন্টেশনে বর্ণিত) হিসাবে সামগ্রী সংরক্ষণ করে । উভয় ক্ষেত্রেই আপনার স্ক্রিপ্টটি আপলোড করা ফাইলটির সম্পূর্ণতা না পাওয়া পর্যন্ত অবরুদ্ধ থাকবে।

এটিকে ঘিরে কাজ করার সবচেয়ে সহজ উপায় যা আমি পেয়েছি তা হ'ল:

1) আপনার নিজের ফাইলের মতো আইও ক্লাস তৈরি করুন যেখানে আপনি আগত ডেটার সমস্ত প্রসেসিং করেন

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

আমি আমার সমাধান ভাগ করে নিয়েছি (ধরে নিলাম সব কিছু ইতিমধ্যে ফ্লাস্কে গুগল বালতিতে সংযোগের জন্য কনফিগার করা হয়েছে)

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())

আমার পদবী

ফ্লাস্কে সরাসরি গুগল বালতিতে


-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>
<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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.