IT-Swarm.Net

Χρησιμοποιώντας συστροφή για τη μεταφόρτωση δεδομένων POST με αρχεία

Θα ήθελα να χρησιμοποιήσω το cURL όχι μόνο για την αποστολή παραμέτρων δεδομένων σε HTTP POST αλλά και για την αποστολή αρχείων με συγκεκριμένο όνομα φόρμας. Πώς πρέπει να το κάνω;

HTTP Post parameters:

userid = 12345 filecomment = Αυτό είναι ένα αρχείο εικόνας

HTTP Ανάρτηση αρχείου: Τοποθεσία αρχείου = /home/user1/Desktop/test.jpg Όνομα φόρμας για αρχείο = εικόνα (αντιστοιχεί στο $ _FILES ['image'] στην πλευρά PHP)

Έκανα μέρος της εντολής cURL ως εξής:

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 ['image'] για να παραλάβω αρχεία στο σενάριο PHP.

Πώς μπορώ να προσαρμόσω τις εντολές μου cURL ανάλογα;

355
thotheolh

Πρέπει να χρησιμοποιήσετε την επιλογή -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
569
jimp

Πιάνοντας το αναγνωριστικό χρήστη ως μεταβλητή διαδρομής (συνιστάται):

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/
77
r1ckr

Εδώ είναι η λύση μου, έχω διαβάσει πολλές θέσεις και ήταν πραγματικά χρήσιμη. Τελικά έγραψα κάποιο κώδικα για μικρά αρχεία, με cURL και PHP που νομίζω ότι είναι πραγματικά χρήσιμος.

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" τα ακόλουθα vars δημοσιεύτηκε. Μπορείτε εύκολα να δοκιμάσετε με αυτή τη δέσμη ενεργειών και θα πρέπει να λαμβάνετε αυτά τα σφάλματα στη λειτουργία 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>";
}

Θα πρέπει να δουλέψει καλά, μπορεί να είναι καλύτερες λύσεις, αλλά αυτό λειτουργεί και είναι πραγματικά χρήσιμο να κατανοήσουμε τον τρόπο με τον οποίο ο ομιλητής Borderary και multipart/from-data εργάζεται στη βιβλιοθήκη PHP και cURL.

22
Libertese

αν μεταφορτώνετε δυαδικό αρχείο όπως csv, χρησιμοποιήστε τη παρακάτω φόρμα για να μεταφορτώσετε το αρχείο

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'
5
KARTHIKEYAN.A

Ως εναλλακτική λύση για την curl, μπορείτε να χρησιμοποιήσετε HTTPie , είναι CLI, 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
Gianfranco P.

Εδώ μπορείτε να διαγράψετε σωστά τα αυθαίρετα ονόματα αρχείων των φορτωμένων αρχείων με bash:

#!/bin/bash
set -eu

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

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