דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. העלאת קובץ בינארי בCURL עם PHP

העלאת קובץ בינארי בCURL עם PHP

מתוזמן נעוץ נעול הועבר ארכיון code613m
5 פוסטים 2 כותבים 588 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • שואףש מנותק
    שואףש מנותק
    שואף
    כתב ב נערך לאחרונה על ידי
    #1

    שלום
    אני משתמש בCURL כדי להעלות קבצים דרך PHP.
    הצורה הרגילה היא להשתמש בCURLFile כדי לכלול את הקובץ, אבל יש לי קובץ בינארי שאני רוצה להעלות, ולא מוצא איך לעשות את זה (לא רוצה לשמור אותו ואז להעלות, אני מאמין שיש דרך יותר קצרה)
    אשמח לקבל עזרה
    תודה רבה

    <?php
    $file = 'files/song.mp3';
    
    // ככה אני תמיד עושה
    $upload = new CURLFile(realpath($file));
    
    // אבל אני רוצה לעשות ככה
    //	$upload = file_get_contents($file);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, compact('upload'));
    $value = curl_exec($ch);
    curl_close ($ch);
    

    פורסם במקור בפורום CODE613 ב07/01/2018 23:23 (+02:00)

    ליצירת קשר: admin@i-call.me

    הידד! גישה למייל גם בלי מחשב ואינטרנט!

    תגובה 1 תגובה אחרונה
    0
    • מ מנותק
      מ מנותק
      מצפה לגדול
      כתב ב נערך לאחרונה על ידי
      #2

      למה אתה משתמש בCURL?

      אתה יכול להשתמש רק ב file_get_contents.
      הפונקציה הזאת לא נועדה רק לקבל קבצים מקומים, אלא גם לתקשורת (אותה פעולה שעושה הCURL).
      כך:

      $file = 'files/song.mp3';
          
      $body = file_get_contents($file);
      
      $opts = array('http' => array(
      
                  'method'  => 'POST',
      
                  'content' => $body,
      
                  'follow_location' => false) );
      
      $context  = stream_context_create($opts);
      
      $url = 'https://www.a.co.il/';
               
      $result = file_get_contents($url, FALSE, $context);
      

      (רק צריך להתאים את צורת השליחה.
      אתה תצטרך להשתמש במחלקה שתסדר את הבודי.
      אני משתמש במחלקה הזאת:

      class BodyPost
      {
      // part "multipart/form-data"
          public static function PartPost($name, $val)
           {
               $body = 'Content-Disposition: form-data; name="' . $name . '"';
      // check instance of oFile
               if($val instanceof oFile)
                {
                    $file = $val->Name();
                    $mime = $val->Mime();
                    $cont = $val->Content();
      
                    $body .= '; filename="' . $file . '"' . "\r\n";
                    $body .= 'Content-Type: ' . $mime ."\r\n\r\n";
                    $body .= $cont."\r\n";
                } else $body .= "\r\n\r\n".$val."\r\n";
               return $body;
           }
      
          public static function Get(array $post, $delimiter = '-------------0123456789')
           {
               if(is_array($post) && !empty($post))
                {
                    $bool = true;
                    //foreach($post as $val) if($val instanceof oFile) {$bool = true; break; };
                    if($bool)
                     {
                         $ret = '';
                         foreach($post as $name=>$val)
                             $ret .= '--' . $delimiter. "\r\n". self::PartPost($name, $val);
                         $ret .= "--" . $delimiter . "--\r\n";
                     } else $ret = http_build_query($post);
                } else throw new \Exception('Error input param!');
               return $ret;
           }
      }
      
      class oFile
      {
           private $name;
           private $mime;
           private $content;
      
           public function __construct($name, $mime=null, $content=null)
            {
                if(is_null($content))
                 {
                     $info = pathinfo($name);
      // check is exist and readable file
                     if(!empty($info['basename']) && is_readable($name))
                      {
                          $this->name = $info['basename'];
      // get MIME
                          $this->mime = mime_content_type($name);
      // load file
                          $content = file_get_contents($name);
                          if($content!==false)
                          {
                              $this->content = $content;
                          }
                          else
                          {
                              throw new Exception('Don`t get content - "'.$name.'"');
                          }
                      }
                      else
                      {
                          throw new Exception('Error param');
                      }
                 }
                 else
                 {
                         $this->name = $name;
                         if(is_null($mime)) $mime = mime_content_type($name);
                         $this->mime = $mime;
                         $this->content = $content;
                  };
            }
      
          public function Name() { return $this->name; }
      
          public function Mime() { return $this->mime; }
      
          public function Content() { return $this->content; }
      
      }
      

      ואז כך מתבצעת ההעלאה:)

      $file = 'files/song.mp3';
      
      $file = new oFile($file);
      
      $delimiter = '----'.uniqid();
      
      $body = BodyPost::Get($file, $delimiter);
      
      $opts = array('http' => array(
      
                  'method'  => 'POST',
      
                  'header'  => 'Content-Type: multipart/form-data; boundary='.$delimiter,
      
                  'content' => $body,
      
                  'follow_location' => false) );
      
      $context  = stream_context_create($opts);
      
      $url = 'https://www.a.co.il/';
               
      $result = file_get_contents($url, FALSE, $context);
      

      פורסם במקור בפורום CODE613 ב08/01/2018 14:05 (+02:00)

      תגובה 1 תגובה אחרונה
      2
      • שואףש מנותק
        שואףש מנותק
        שואף
        כתב ב נערך לאחרונה על ידי
        #3

        תודה רבה

        הוא מחזיר לי שגיאה

        Catchable fatal error: Argument 1 passed to BodyPost::Get() must be of the type array, object given
        

        למרות שעשיתי בדיוק מה שכתבת...

        דרך CURL זה לא שייך?

        פורסם במקור בפורום CODE613 ב11/01/2018 00:51 (+02:00)

        ליצירת קשר: admin@i-call.me

        הידד! גישה למייל גם בלי מחשב ואינטרנט!

        תגובה 1 תגובה אחרונה
        0
        • מ מנותק
          מ מנותק
          מצפה לגדול
          כתב ב נערך לאחרונה על ידי
          #4

          אתה צודק, שכחתי משהו, שהפרמטר שמעבירים ל BodyPost::Get, צריך להיות מערך.
          כזה:

          <?php
          $file = 'AA.txt';
           
          $file = new oFile($file);
          
          // מערך:
          $body = array($file);
           
          $delimiter = '----'.uniqid();
           
          $body = BodyPost::Get($body, $delimiter);
           
          $opts = array('http' => array(
           
                      'method'  => 'POST',
           
                      'header'  => 'Content-Type: multipart/form-data; boundary='.$delimiter,
           
                      'content' => $body,
           
                      'follow_location' => false) );
           
          $context  = stream_context_create($opts);
           
          $url = 'https://www.a.co.il/';
                    
          $result = file_get_contents($url, FALSE, $context);
          ?>
          

          פורסם במקור בפורום CODE613 ב11/01/2018 14:36 (+02:00)

          תגובה 1 תגובה אחרונה
          1
          • שואףש מנותק
            שואףש מנותק
            שואף
            כתב ב נערך לאחרונה על ידי
            #5

            תודה רבה זה נפלא

            פורסם במקור בפורום CODE613 ב12/01/2018 00:40 (+02:00)

            ליצירת קשר: admin@i-call.me

            הידד! גישה למייל גם בלי מחשב ואינטרנט!

            תגובה 1 תגובה אחרונה
            2

            בא תתחבר לדף היומי!
            • התחברות

            • אין לך חשבון עדיין? הרשמה

            • התחברו או הירשמו כדי לחפש.
            • פוסט ראשון
              פוסט אחרון
            0
            • דף הבית
            • קטגוריות
            • פוסטים אחרונים
            • משתמשים
            • חיפוש
            • חוקי הפורום