Завитая загрузка PHP файла - PullRequest
5 голосов
/ 08 октября 2010

Привет, пытаюсь опубликовать файл, используя curl, и все работает отлично. У меня есть одна проблема. Я не могу объявить свой файл вне моей функции post_file (). Я вызываю эту функцию в своем приложении много раз, поэтому хочу, чтобы ее можно было использовать повторно.

Так что это работает:

function call_me(){
    $file_path = "/home/myfile.mov";
    $url = "http://myurl.com";
    $this->post_file($url, $file_path);
}
function post_file($url, $file_path){
    $data['Filedata'] = "@".$file_path;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $response = curl_exec($ch);
    return $response;
}

Однако это не так:

function call_me(){
    $file_path = "/home/myfile.mov";
    $url = "http://myurl.com";
    $data['Filedata'] = "@".$file_path;
    $this->post_file($url, $data);
}
function post_file($url, $data){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $response = curl_exec($ch);
    return $response;
}

Есть идеи? Приветствия.

1 Ответ

5 голосов
/ 08 октября 2010

Я действительно не вижу разницы (для повторного использования) между двумя наборами кодов. Единственное преимущество # 2 - это передача целого объекта $data - если это вообще преимущество ... это приводит к проблемам с безопасностью в вашем посте CURL ... так это действительно лучше, чем создавать новый $data объект каждый раз (за # 1 )? С именем функции post_file ожидаемое поведение будет для # 1 - отправить один файл на URL, тогда как код # 2 может быть использован / использован для других вещей , Возможно, улучшение удобства использования # 1 будет:

function post_files($url,$files) {
    //Post 1-n files, each element of $files array assumed to be absolute
    // path to a file.  $files can be array (multiple) or string (one file).
    // Data will be posted in a series of POST vars named $file0, $file1...
    // $fileN
    $data=array();
    if (!is_array($files)) {
      //Convert to array
      $files[]=$files;
    }
    $n=sizeof($files);
    for ($i=0;$i<$n;$i++) {
      $data['file'+$i]="@".$files[$i];
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $response = curl_exec($ch);
    return $response;
}

Относительно того, почему это не работает для вас прямо сейчас - я предполагаю, что где-то там есть опечатка. Точно ли скопирован этот код или вы перефразируете для нас? Попробуйте print_r($data); непосредственно перед строкой curl_setopt($ch, CURLOPT_POSTFIELDS, $data);.

Функция не может узнать, был ли объект создан внутри функции ( # 1 ) или передан ( # 2 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...