পাইথন ফাইল আপলোড অনুরোধ


123

আমি পাইথন অনুরোধ লাইব্রেরি ব্যবহার করে একটি ফাইল আপলোড করার একটি সহজ কাজ সম্পাদন করছি। আমি স্ট্যাক ওভারফ্লো অনুসন্ধান করেছি এবং কারও কাছে একই সমস্যা নেই বলে মনে হচ্ছে, সার্ভারের মাধ্যমে ফাইলটি গ্রহণ করা হয়নি:

import requests
url='http://nesssi.cacr.caltech.edu/cgi-bin/getmulticonedb_release2.cgi/post'
files={'files': open('file.txt','rb')}
values={'upload_file' : 'file.txt' , 'DB':'photcat' , 'OUT':'csv' , 'SHORT':'short'}
r=requests.post(url,files=files,data=values)

আমি আমার ফাইলনামের সাথে 'আপলোড_ফাইল' কীওয়ার্ডের মানটি পূরণ করছি, কারণ যদি আমি এটি ফাঁকা রাখি, এটি বলে

Error - You must select a file to upload!

এবং এখন আমি পেতে

File  file.txt  of size    bytes is  uploaded successfully!
Query service results:  There were 0 lines.

ফাইলটি খালি থাকলেই এটি উপস্থিত হয়। সুতরাং আমি কীভাবে আমার ফাইলটি সফলভাবে প্রেরণ করব সে সম্পর্কে আমি আটকে আছি। আমি জানি যে ফাইলটি কাজ করে কারণ আমি যদি এই ওয়েবসাইটে যাই এবং ম্যানুয়ালি ফর্মটি পূরণ করি তবে এটি ম্যাচ করা অবজেক্টগুলির একটি দুর্দান্ত তালিকা দেয়, যা আমি পরে করছি। আমি সত্যিই সমস্ত ইঙ্গিত প্রশংসা করব।

সম্পর্কিত কিছু অন্যান্য থ্রেড (তবে আমার সমস্যার উত্তর দিচ্ছে না):

উত্তর:


210

যদি upload_fileফাইলটি বোঝানো হয় তবে ব্যবহার করুন:

files = {'upload_file': open('file.txt','rb')}
values = {'DB': 'photcat', 'OUT': 'csv', 'SHORT': 'short'}

r = requests.post(url, files=files, data=values)

এবং ফাইলের বিষয়বস্তুগুলিতে ক্ষেত্র সেট করে requestsএকাধিক অংশ ফর্ম POST বডি প্রেরণ করবে ।upload_filefile.txt

ফাইলের নামটি নির্দিষ্ট ক্ষেত্রের জন্য মাইম শিরোনামে অন্তর্ভুক্ত করা হবে:

>>> import requests
>>> open('file.txt', 'wb')  # create an empty demo file
<_io.BufferedWriter name='file.txt'>
>>> files = {'upload_file': open('file.txt', 'rb')}
>>> print(requests.Request('POST', 'http://example.com', files=files).prepare().body.decode('ascii'))
--c226ce13d09842658ffbd31e0563c6bd
Content-Disposition: form-data; name="upload_file"; filename="file.txt"


--c226ce13d09842658ffbd31e0563c6bd--

filename="file.txt"প্যারামিটারটি নোট করুন ।

filesআপনার আরও নিয়ন্ত্রণের প্রয়োজন হলে 2 এবং 4 টি উপাদানের মধ্যে ম্যাপিং মানটির জন্য আপনি একটি টুপল ব্যবহার করতে পারেন । প্রথম উপাদানটি ফাইলের নাম এবং এরপরে সামগ্রীগুলি এবং একটি alচ্ছিক সামগ্রী-ধরণের শিরোনাম মান এবং অতিরিক্ত শিরোনামগুলির একটি alচ্ছিক ম্যাপিং:

files = {'upload_file': ('foobar.txt', open('file.txt','rb'), 'text/x-spam')}

এটি optionচ্ছিক শিরোনামগুলি বাদ দিয়ে বিকল্প ফাইল নাম এবং সামগ্রীর ধরণের সেট করে।

যদি আপনি বোঝাচ্ছেন যে কোনও POST বডি কোনও ফাইল থেকে নেওয়া হবে (অন্য কোনও ক্ষেত্র নির্দিষ্ট করা নেই), তবে filesপ্যারামিটারটি ব্যবহার করবেন না , কেবল ফাইলটি সরাসরি পোস্ট করুন data। এরপরে আপনি একটি Content-Typeশিরোনামও সেট করতে চাইতে পারেন , অন্যথায় কোনওটি সেট করা হবে না। পাইথন অনুরোধগুলি দেখুন - একটি ফাইল থেকে পোস্ট করুন


হাই, আমি একই নামের সাথে একাধিক ফাইল কীভাবে প্রেরণ করব? উদাহরণস্বরূপ 'সংযুক্তি' পছন্দ করুন।
উইলিয়াম উইনো

4
@William: আপনি 2-মান tuples একটি ক্রম খুব যা আপনি পুনরায় ব্যবহারযোগ্য ফিল্ডের নাম দেয় ব্যবহার করতে পারেন: files = [('attachment', open('attachment1.txt', 'rb')), ('attachment', open('attachment2.txt', 'rb'))]। প্রতিটি টিপল কী এবং মানের এক জোড়া।
মার্টিজন পিটারস

2
এছাড়াও আপনি এটিও ব্যবহার করতে পারেন files={'file':('nameoffile',open('namoffile','rb'),'Content-Type':'text/html','other header'),'file2':('nameoffile2',open('nameoffile2','rb'),'Content-Type':'application/xml','other header')}তবে যদি ফাইলগুলি = {} ব্যবহার করা হয় তবে শিরোনাম = {'বিষয়বস্তুর ধরণ': 'ব্লাহ ব্লাহ' be অবশ্যই ব্যবহার করা উচিত নয়! -> @ মার্টিজান-পাইটারস: মাল্টিপার্ট / ফর্ম-ডেটা বাদ দেওয়ার কারণে বিষয়বস্তুর ধরণটি পোস্ট বডির অংশগুলি বর্ণহীন করতে ব্যবহৃত সীমানা মানকে অবশ্যই অন্তর্ভুক্ত করতে হবে। সামগ্রী-প্রকারের শিরোনামটি সেট না করা নিশ্চিত করে যে অনুরোধগুলি এটি সঠিক মানকে সেট করে।
জাকি

1
@ মার্তিজ্নপিটারগুলি কি এই ঝুঁকিটি ফাইলটি ফাঁস করে না? কি requestsএটা বন্ধ?
ম্যাট মেসারস্মিথ

4
@ ম্যাটমেসারস্মিথ: না, এটি বন্ধ নয়। আপনি যদি ফাইলটি বন্ধ করতে চান তবে ম্যাপিংয়ে ব্যবহার with open(...) as fobj:এবং ব্যবহার fobjকরুন files
মার্টিজন পিটারস

34

(2018) নতুন অজগর অনুরোধের গ্রন্থাগারটি এই প্রক্রিয়াটিকে সহজ করেছে, আমরা 'ফাইল' পরিবর্তনশীলটি সিগন্যালের জন্য ব্যবহার করতে পারি যে আমরা একটি বহুগুণ-এনকোডযুক্ত ফাইল আপলোড করতে চাই

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)
r.text

3
অনুরোধ গ্রন্থাগার স্বয়ংক্রিয়ভাবে ফাইলটি বন্ধ করে দেয়?
ডিমেট্রিস

1
হ্যালো, আমি এই লাইব্রেরিটি ব্যবহার করার পরে কিছুক্ষণ হয়ে গেল। সুন্দর প্রশ্ন আপনি কি lsof | টাইপ করে আমাকে এবং অন্যকে হাত দিতে পারেন? গ্রেপ "ফাইলের নাম" এবং আপনার ফলাফলগুলি আমাদের সাথে ভাগ করুন? ধন্যবাদ :)
লেটক্যাট

1
এর ব্যবহারের সাথে lsofমনে হয় যে ফাইলটি উন্মুক্ত থাকে বা কমপক্ষে, আমি নিম্নলিখিত ফলাফলগুলি এভাবে ব্যাখ্যা করি interpret এর আগে, চালানো সম্পর্কে টেবিলে openকোনও রেকর্ড নেই । তারপরে মৃত্যুদন্ড কার্যকর করার পরে , একাধিক রেকর্ড অ্যাক্সেস সহ উপস্থিত হয় । কার্যকর করার পরে , রেকর্ডগুলি এখনও রয়েছে যা ইঙ্গিত করে যে ফাইলটি বন্ধ হয়নি। lsoffilenameopenreadrequests.post
ডেমেট্রিস

23

ক্লায়েন্ট আপলোড

আপনি যদি পাইথন requestsলাইব্রেরির সাথে একটি একক ফাইল আপলোড করতে চান , তবে অনুরোধ করা লাইব স্ট্রিমিং আপলোডগুলিকে সমর্থন করে , যা আপনাকে মেমোরিতে না পড়ে বড় ফাইল বা স্ট্রিমগুলি প্রেরণ করতে দেয় ।

with open('massive-body', 'rb') as f:
    requests.post('http://some.url/streamed', data=f)

সার্ভার সাইড

তারপরে ফাইলটি server.pyপাশের স্টোর করুন যা মেমরিতে লোড না করে স্ট্রিমটিকে ফাইলে সংরক্ষণ করে। ফ্লাস্ক ফাইল আপলোডগুলি ব্যবহারের সাথে নিম্নলিখিত উদাহরণ রয়েছে ।

@app.route("/upload", methods=['POST'])
def upload_file():
    from werkzeug.datastructures import FileStorage
    FileStorage(request.stream).save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    return 'OK', 200

বা বড় ফাইল আপলোড (22 60 সেকেন্ডের মধ্যে st 22 GiB ফাইলটি মেমরির অকার্যকরভাবে এড়াতে) যাতে " বড় ফাইল আপলোডগুলি মেমরি খায় " ইস্যুটির ঠিক করার জন্য উল্লিখিত ওয়ার্কজেগ ফর্ম ডেটা পার্সিং ব্যবহার করুন Mem মেমরির ব্যবহার প্রায় স্থির থাকে 13 এমআইবি।)।

@app.route("/upload", methods=['POST'])
def upload_file():
    def custom_stream_factory(total_content_length, filename, content_type, content_length=None):
        import tempfile
        tmpfile = tempfile.NamedTemporaryFile('wb+', prefix='flaskapp', suffix='.nc')
        app.logger.info("start receiving file ... filename => " + str(tmpfile.name))
        return tmpfile

    import werkzeug, flask
    stream, form, files = werkzeug.formparser.parse_form_data(flask.request.environ, stream_factory=custom_stream_factory)
    for fil in files.values():
        app.logger.info(" ".join(["saved form name", fil.name, "submitted as", fil.filename, "to temporary file", fil.stream.name]))
        # Do whatever with stored file at `fil.stream.name`
    return 'OK', 200

0

উবুন্টুতে আপনি এইভাবে প্রয়োগ করতে পারেন,

কোনও স্থানে ফাইল অস্থায়ী করতে (অস্থায়ী) এবং তারপরে এটিপিতে খুলুন এবং প্রেরণ করুন

      path = default_storage.save('static/tmp/' + f1.name, ContentFile(f1.read()))
      path12 = os.path.join(os.getcwd(), "static/tmp/" + f1.name)
      data={} #can be anything u want to pass along with File
      file1 = open(path12, 'rb')
      header = {"Content-Disposition": "attachment; filename=" + f1.name, "Authorization": "JWT " + token}
       res= requests.post(url,data,header)

dataভেরিয়েবলের মান কত ?
am.rez

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