ফাইলগুলির সাথে পোস্টের ডেটা আপলোড করতে কার্ল ব্যবহার করে


413

আমি এইচটিটিপি পোস্টে কেবলমাত্র ডেটা প্যারামিটারগুলি প্রেরণ করতেই নয়, নির্দিষ্ট ফর্মের নামের সাথে ফাইলগুলি আপলোড করতে সিআরএল ব্যবহার করতে চাই। আমার কীভাবে তা করা উচিত?

HTTP পোস্ট পরামিতি:

ইউজারিড = 12345 ফাইল কমেন্ট = এটি একটি চিত্র ফাইল

এইচটিটিপি ফাইল আপলোড: ফাইলের অবস্থান = / home/user1/Desktop/test.jpg ফাইল = চিত্রের ফর্মের নাম (পিএইচপি পাশের $ _FILES ['চিত্র'] এর সাথে সামঞ্জস্য)

আমি নিম্নলিখিত হিসাবে সিআরএল কমান্ডের কিছু অংশ পেয়েছি:

curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php

আমি যে সমস্যাটি পাচ্ছি তা হ'ল:

Notice: Undefined index: image in /var/www/uploader.php

সমস্যাটি হ'ল আমি পিএইচপি স্ক্রিপ্টে ফাইলগুলি তুলতে $ _FILES ['চিত্র'] ব্যবহার করছি।

আমি কীভাবে সে অনুযায়ী আমার সিআরএল কমান্ডগুলি সামঞ্জস্য করব?

উত্তর:


654

আপনাকে -Fবিকল্পটি ব্যবহার করতে হবে :
-F/--form <name=content> Specify HTTP multipart POST data (H)

এটা চেষ্টা কর:

curl \
  -F "userid=1" \
  -F "filecomment=This is an image file" \
  -F "image=@/home/user1/Desktop/test.jpg" \
  localhost/uploader.php

1
আমি url- এনকোডিং ফাইল সম্পর্কে অংশ দ্বারা বিভ্রান্ত। আমি কোনও প্রকার সমস্যা ছাড়াই এ জাতীয় জেপিজি এবং পিএনজি ফাইলগুলি পরিবর্তন না করেই আপলোড করেছি।
ডিয়ানা গেলবার্ট

1
@ ডেভিডগেলবার্ট আপনি ঠিক বলেছেন আমার প্রাথমিক উত্তরটি -dভুলক্রমে বিকল্পটি রেফারেন্স করেছে , যার জন্য ইউআরএল-এনকোড ইনপুট লাগবে। আমি -Fঅপশনটির উত্তর আপডেট করার সময় আমার তা সরিয়ে নেওয়া উচিত । এটি ধরার জন্য ধন্যবাদ
জিম্প

3
@ user956424 উদাহরণস্বরূপ, আপনার ক্ষেত্রের নামটিতে "চিত্র" সেট করুন। এবং কিছু ভাষা, যেমন পিএইচপি, একটি অ্যারে তৈরি করবে যদি আপনি ইনপুটগুলির জন্য একত্রে গোষ্ঠীভুক্ত করা দরকার তবে "চিত্র []" এর মতো কিছু নির্দিষ্ট করেন।
জিম্প

1
কি @মধ্যে image=@/..?
টিমো

2
@ টিমো এর অর্থ হল নামযুক্ত ফর্ম ক্ষেত্রের সামগ্রীগুলি কোনও ফাইল পাথ থেকে লোড করা উচিত। এটি ছাড়া স্ট্রিং আর্গুমেন্ট নিজেই পাস করা হয়।
জিম্প

93

পাথ ভেরিয়েবল হিসাবে ব্যবহারকারী আইডিটি ধরা (প্রস্তাবিত):

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "data=@test.mp3" http://mysuperserver/media/1234/upload/

ফর্মের অংশ হিসাবে ব্যবহারকারীর আইডি ধরছে:

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "data=@test.mp3;userid=1234" http://mysuperserver/media/upload/

বা:

curl -i -X POST -H "Content-Type: multipart/form-data" 
-F "data=@test.mp3" -F "userid=1234" http://mysuperserver/media/upload/

16
ব্যবহার -এফ সেট করার দরকার নেই"Content-Type: multipart/form-data"
উইলিয়াম হু

10
আপনার নির্দেশিত সেমিকোলন বিভাজকটির সাথে আমি সঠিকভাবে কাজ করতে -F পেতে পারিনি। পরিবর্তে, আমাকে দুটি অপ্রয়োজনীয় -F যুক্তি সরবরাহ করতে হয়েছিল। পছন্দ করুন: -F "data=@test.mp3" -F "ইউজারিড = 1234"
রবপ্রাইস্টলি

22

আমার সমাধানটি এখানে, আমি প্রচুর পোস্ট পড়ছি এবং সেগুলি সত্যই সহায়ক ছিল। পরিশেষে আমি ছোট ফাইলগুলির জন্য সিআরএল এবং পিএইচপি দিয়ে কিছু কোড লিখেছিলাম যা আমি মনে করি এটি সত্যিই দরকারী।

public function postFile()
{    
        $file_url = "test.txt";  //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt"
        $eol = "\r\n"; //default line-break for mime type
        $BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function
        $BODY=""; //init my curl body
        $BODY.= '--'.$BOUNDARY. $eol; //start param header
        $BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content.
        $BODY .= "Some Data" . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data
        $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param,
        $BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance
        $BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row
        $BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol,
        $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data,
        $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header.



        $ch = curl_init(); //init curl
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                         'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable
                         ,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable
                    );
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent
        curl_setopt($ch, CURLOPT_URL, "api.endpoint.post"); //setting our api post url
        curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint
        curl_setopt($ch, CURLOPT_POST, true); //set as post
        curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY 


        $response = curl_exec($ch); // start curl navigation

     print_r($response); //print response

}

এটির সাথে আমাদের নিম্নলিখিত অ্যাপগুলি "api.endPoint.post" এ পাওয়া উচিত get আপনি সহজেই এই স্ক্রিপ্টটির সাহায্যে পরীক্ষা করতে পারেন এবং postFile()শেষ সারিতে আপনার এই ডিবাগগুলি গ্রহণ করা উচিত ।

print_r($response); //print response

public function getPostFile()
{

    echo "\n\n_SERVER\n";
    echo "<pre>";
    print_r($_SERVER['HTTP_X_PARAM_TOKEN']);
    echo "/<pre>";
    echo "_POST\n";
    echo "<pre>";
    print_r($_POST['sometext']);
    echo "/<pre>";
    echo "_FILES\n";
    echo "<pre>";
    print_r($_FILEST['somefile']);
    echo "/<pre>";
}

এটি ভালভাবে কাজ করা উচিত, তারা আরও ভাল সমাধান হতে পারে তবে এটি কাজ করে এবং পিএইচপি এবং সিআরএল লাইব্রেরিতে বাউন্ডারি এবং মাল্টিপার্ট / থেকে-ডেটা মাইম কীভাবে কাজ করে তা বুঝতে সহায়ক।


আপনার যদি নন-এনকোডযুক্ত ফাইলটি প্রেরণ করতে হয় তবে এই লাইনগুলি পরিবর্তন করুন $ BODY। = 'সামগ্রী-স্থানান্তর-এনকোডিং: গুণিত / ফর্ম-ডেটা'। ol ইওল eol $; // আমরা সর্বশেষ সামগ্রী এবং 2 $ ইওল, $ দেহ। = ফাইল_জেট_কন্টেন্টস ($ file_url) রেখেছি। eol $; // আমরা বেস 64 ফাইল ফাইল এবং ডেটা শেষ করতে
ol ইওল লিখি

8

আপনি যদি বাইনারি ফাইল যেমন সিএসভি আপলোড করছেন তবে ফাইল আপলোড করতে নীচের ফর্ম্যাটটি ব্যবহার করুন

curl -X POST \
    'http://localhost:8080/workers' \
    -H 'authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6ImFjY2VzcyIsInR5cGUiOiJhY2Nlc3MifQ.eyJ1c2VySWQiOjEsImFjY291bnRJZCI6MSwiaWF0IjoxNTExMzMwMzg5LCJleHAiOjE1MTM5MjIzODksImF1ZCI6Imh0dHBzOi8veW91cmRvbWFpbi5jb20iLCJpc3MiOiJmZWF0aGVycyIsInN1YiI6ImFub255bW91cyJ9.HWk7qJ0uK6SEi8qSeeB6-TGslDlZOTpG51U6kVi8nYc' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-binary '@/home/limitless/Downloads/iRoute Masters - Workers.csv'

4
আমি বাইনারি সিএসভি ফাইলের উদাহরণ দেখতে চাই।
পলিস

4
@ পলিস বিকল্পটি পতাকাটির বিপরীতে ডেটাগুলির কোনও প্রাক প্রসেসিং না করার --data-binaryনির্দেশ curlদেয় । আপনার মন্তব্য সরাসরি সম্বোধন করতে, নোট পাঠ্যটি বাইনারিও রয়েছে, তবে আমরা এটি ASCII অক্ষর হিসাবে ব্যাখ্যা করতে পারি। আপনি যদি সত্যিই একটি স্বতন্ত্র উদাহরণ চান, এমন একটি সিএসভি সম্পর্কে চিন্তা করুন যার ক্ষেত্রগুলিতে ইমোজি রয়েছে। তাদের বাইটগুলি সরাসরি পাঠ্যে মানচিত্র হয় না--data
সিপরিয়ান টমোইগা

3

আমাকে এখানে নিয়ে আসা সমস্যাটি একটি মৌলিক ব্যবহারকারীর ত্রুটি হিসাবে পরিণত হয়েছিল - আমি @ফাইলের পথে সাইনটি অন্তর্ভুক্ত করছিলাম না এবং তাই কার্ল বিষয়বস্তুগুলির পরিবর্তে ফাইলের নাম / নামটি পোস্ট করছিল। Content-Lengthমান অতএব 8 বদলে 479 আমি আমার পরীক্ষা ফাইলের legnth দেওয়া দেখুন বলে আশা করা হয়েছিল।

Content-Lengthহেডার স্বয়ংক্রিয়ভাবে গণনা করা হবে যখন কার্ল সার্চ এবং পোস্ট ফাইল।

curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/

... <সামগ্রী-দৈর্ঘ্য: 479 ...

ভবিষ্যতে অন্যান্য নবজাতকদের সহায়তা করার জন্য এখানে পোস্ট করা।


2

এর বিকল্প হিসাবে curlআপনি এইচটিটিপি , এটি সিএলআই, সিআরএল-জাতীয় সরঞ্জাম মানুষের জন্য ব্যবহার করতে পারেন ।

  1. ইনস্টলেশন নির্দেশাবলী: https://github.com/jakubroztocil/httpie#installation

  2. তারপরে, চালান:

    http -f POST http://localhost:4040/api/users username=johnsnow photo@images/avatar.jpg
    
    HTTP/1.1 200 OK
    Access-Control-Expose-Headers: X-Frontend
    Cache-control: no-store
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Length: 89
    Content-Type: text/html; charset=windows-1251
    Date: Tue, 26 Jun 2018 11:11:55 GMT
    Pragma: no-cache
    Server: Apache
    Vary: Accept-Encoding
    X-Frontend: front623311
    
    ...


1

এখানে কীভাবে সঠিকভাবে আপলোড করা ফাইলগুলির স্বেচ্ছাসেবী ফাইল নামগুলি পালাতে হবে bash:

#!/bin/bash
set -eu

f="$1"
f=${f//\\/\\\\}
f=${f//\"/\\\"}
f=${f//;/\\;}

curl --silent --form "uploaded=@\"$f\"" "$2"

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