php cURL error上传未对齐的文件大小

I am trying to transfer a file from one server to another. I am using php5 with curl

$fp = fopen("/tmp/help.txt", "r");    
$url = "ftp://admin:support@portal-test.uk.xxx.com:21/tmp/help.txt";    
$ch = curl_init();        
curl_setopt($ch, CURLOPT_URL, $url);     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     
curl_setopt($ch, CURLOPT_UPLOAD, 1);     
curl_setopt($ch, CURLOPT_INFILE, $fp);     
//curl_setopt($ch, CURLOPT_FTPASCII, 1);     
curl_setopt($ch, CURLOPT_INFILESIZE, filesize(__FILE__));     
$result = curl_exec($ch);         
print_r(curl_getinfo($ch));    
echo "

cURL error number:" .curl_errno($ch);    
echo "

cURL error:" . curl_error($ch);   
curl_close($ch); 

I get an error as below:

Array
(
    [url] => ftp://admin:support@portal-test.uk.xxx.com:21/tmp/help.txt
    [content_type] => 
    [http_code] => 550
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.033012
    [namelookup_time] => 0.015422
    [connect_time] => 0.015798
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 0
    [redirect_time] => 0
)
cURL error number:9
cURL error:Server denied you to change to the given directory

I want to transfer a file from /tmp/ to another server /tmp/. How would i do this?

here is my script which works

<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/London');
set_include_path('.' . PATH_SEPARATOR . '/opt/eposdatatransfer/application/../library' . PATH_SEPARATOR . get_include_path());
require('Zend/Date.php');
$use_pasv = true;$ftp_server = "172.16.0.65"; 
$ftp_user_name = "h3111142";
$ftp_user_pass = "seismic";
$ftp_remote_path = "/tmp";
$ftp_remote_file = array("/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.headers","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.headers.ext0","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.history","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.pds","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.pkey","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.traces","/files/nas1/epos4/eposbulk/h3111142/seismic/Line_58/0000000500900bc1.000000.00000005.traces.ext0",) ;
$ftp_local_file = array(59,59,59,59,59,59,59,) ;
$emailNotifications = array();
$GLOBALS['start']="";
$GLOBALS['current']="";
date_default_timezone_set ( "Europe/London" );

$conn_id = ftp_connect($ftp_server);
if (!$conn_id){
    echo "Unable to connect to $ftp_server";
    updateStatus($ftp_local_file[$count], 0);
    exit(1);
}

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

if (!$login_result){
    echo "Inavalid login/password for $ftp_user_name on $ftp_server";
    updateStatus($ftp_local_file[$count], 0);
    ftp_close($conn_id);
    exit(2);
}

ftp_pasv($conn_id, $use_pasv);

if (!ftp_chdir($conn_id, $ftp_remote_path)){
    echo "Invalid remote path $ftp_remote_path";
    ftp_close($conn_id);
    updateStatus($ftp_local_file[$count], 0);
    exit(3);
}   

$count = 0;
foreach($ftp_remote_file as $key => $value){
    updateStatus($ftp_local_file[$count], 2);

    if(!empty($value)){
        if (ftp_put($conn_id, $value, $value, FTP_BINARY)){
            updateStatus($ftp_local_file[$count], 1);

        }else{
            $use_pasv = false;
            ftp_pasv($conn_id, $use_pasv);

            if (ftp_put($conn_id, $value, $value, FTP_BINARY)){
                updateStatus($ftp_local_file[$count], 1);
            }else{
                updateStatus($ftp_local_file[$count], 0);
                ftp_close($conn_id);
                echo "Error while uploading $value";
                exit(4);
            }
        }
    }
    $count++;
}

ftp_close($conn_id);

$GLOBALS['current'] = null;
sendmail($emailNotifications,$ftp_remote_file, $ftp_local_file);

function updateStatus($id, $status){

    $con = mysql_connect('hero','eposdata','support');
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db('eposdatatransfer', $con);

    //$mysqldate = date( 'Y-m-d H:i:s');
    $mysqldate = new Zend_Date();
    if($status == 2){
        if($GLOBALS['current']==$id){
            return;
        }else{
            $GLOBALS["current"] = $id;
        }
        $GLOBALS['start'] = $mysqldate;
        $mysqldate = new Zend_Date($mysqldate, Zend_Date::ISO_8601);
        $start = $mysqldate->toString('Y-MM-dd HH:mm:ss');
        //echo $start;
        mysql_query("UPDATE queue SET status=$status, started='$start' WHERE id=$id");
    }elseif($status == 1){
        $dateDiff = ($mysqldate->getTimestamp() - $GLOBALS['start']->getTimestamp()) ;

        $complete = $mysqldate->toString('Y-MM-dd HH:mm:ss');
        mysql_query("UPDATE queue SET status=$status, completed='$complete', duration='$dateDiff' WHERE id=$id");

    }else{
        mysql_query("UPDATE queue SET status=$status WHERE id=$id");
    }

    mysql_close($con);

}

function sendmail($emailNotifications, $ftp_remote_file, $idArr){   
    $message = "";

    $count = 0;
    $data = array();
    foreach($ftp_remote_file as $key => $value){
        if($GLOBALS['current']==$idArr[$count]){
            //return;
        }else{
            $GLOBALS['current'] = $idArr[$count];
            $data = getLineName($idArr[$count]);
            $message =  $message .  $data['data_name'] . "
";
        }

        $count++; 
    }

    $message = $message . "
Downloaded to Woking" ;

    $message = $message . "
This is an automated message. DO NOT REPLY";

    // In case any of our lines are larger than 70 characters, we should use wordwrap()
    $message = wordwrap($message, 70);

    //Send
    foreach($emailNotifications as $key => $value){
        mail("$value", 'Transfer Complete Line: ' . $data['line_name'], $message);
    }
}

function getLineName($id){
    $con = mysql_connect('hero','eposdata','support');
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db('eposdatatransfer', $con);

    $result = mysql_query("select * from queue WHERE id=$id");
    $row = mysql_fetch_assoc($result); 

    return $row;


}

Do you have permission to access that directory? Have you tried logging into FTP server with a standard FTP client and then switch to that directory? I am pretty sure you can't reach the /tmp directory through FTP. The error is simply conveying that to you.

You can save that file in a different location which is accessible to you from the FTP login and then run the script. You can also look into SFTP and see if that is an option for you with a user having access to that folder.

You get the error cURL error:Uploaded unaligned file size (6 out of 1197 bytes) due to providing the wrong file size:

$fp = fopen("/tmp/help.txt", "r");    
// ...
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/tmp/help.txt")); // XXX: was __FILE__