Множество качвания на файлове с cURL

Използвам cURL за прехвърляне на файлове с изображения от един сървър на друг с помощта на PHP. Това е моят cURL код:

// Transfer the original image and thumbnail to our storage server
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'http://' . $server_data['hostname'] . '.localhost/transfer.php');
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
    'upload[]' => '@' . $tmp_uploads . $filename,
    'upload[]' => '@' . $tmp_uploads . $thumbname,
    'salt' => 'q8;EmT(Vx*Aa`fkHX:up^WD^^b#<Lm:Q'
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
$resp = curl_exec($ch);

Това е кодът в transfer.php на сървъра, на който качвам:

if($_FILES && $_POST['salt'] == 'q8;EmT(Vx*Aa`fkHX:up^WD^^b#<Lm:Q')
{
    // Save the files
    foreach($_FILES['upload']['error'] as $key => $error)
    {
        if ($error == UPLOAD_ERR_OK)
        {
            move_uploaded_file($_FILES['upload']['tmp_name'][$key], $_FILES['upload']['name'][$key]);
        }
    }
}

Всичко изглежда работи, с изключение на една малка логическа грешка. Само един файл се записва на сървъра, към който прехвърлям. Това вероятно е така, защото наричам и двете изображения upload[] в масива от полета за публикация, но не знам как иначе да го направя. Опитвам се да имитирам това:

<input type="file" name="upload[]" />
<input type="file" name="upload[]" />

Някой знае ли как мога да накарам това да работи? Благодаря!


person Josh    schedule 09.08.2011    source източник


Отговори (2)


тук е вашата грешка в извикването на curl...

var_dump($post)

вие затривате записите в масива на вашия $post масив, тъй като ключовите низове са идентични...

направи тази промяна

$post = array(
    'upload[0]' => '@' . $tmp_uploads . $filename,
    'upload[1]' => '@' . $tmp_uploads . $thumbname,
    'salt' => 'q8;EmT(Vx*Aa`fkHX:up^WD^^b#<Lm:Q'
);
person David Chan    schedule 09.08.2011

Самият код изглежда добре, но не знам за вашата целева директория на move(). Използвате необработеното име на файл, както е предоставено от клиента (което е вашият curl скрипт). Използвате оригиналното качено име на файл (както е посочено във вашия curl скрипт) като цел на преместването, без проверка за презаписване и без данни за пътя. Ако двата качени файла имат едно и също файлово име, ще презапишете първото обработено изображение с това, което е било обработено второ от PHP.

Опитайте да поставите малко отстраняване на грешки около командата move():

if (!move_uploaded_file($_FILES['upload']['tmp_name'][$key], $_FILES['upload']['name'][$key])) {
   echo "Unable to move $key/";
   echo $_FILES['upload']['tmp_name'][$key];
   echo ' to ';
   echo $_FILES['upload']['name'][$key];
}

(Разделям ехото на няколко реда за четливост).

person Marc B    schedule 09.08.2011
comment
Това не изплюва нищо, което означава, че ходът е бил наред. Целевата директория е същата директория като скрипта transfer.php. Това е просто сървър за съхранение, без структура на директории. - person Josh; 10.08.2011
comment
направете print_r($_FILES) и вижте какво точно се получава за имена на файлове и други подобни. Дори и двете страни да са под ваш контрол, използването на имена на файлове директно като вас ме изнервя. - person Marc B; 10.08.2011