веб-сервисы — различия в размерах файлов до и после загрузки PHP-CURL в Windows WCF

Я пытаюсь загрузить файл с помощью PHP. Не правда ли, туф? Ну, мне нужно сделать это через WCF Webservices. Теперь я застрял с этой последней частью. Когда я загружаю файл, он выглядит следующим образом: 892599 (это то, что Windows и Linux говорят мне о файловой системе. А также то, что говорит мне PHP. Но когда он появляется на сцене (Windows Server, WCF), это только 891400.

Это должно иметь что-то связанное с кодировкой или различиями ОС, но я понятия не имею, где искать сейчас. Ниже мой код PHP.

Как вы можете видеть в коде, я пробовал разные способы, но все с одинаковым результатом. Различия в размерах файлов. Исходный файл (файл, который я пытаюсь загрузить, представляет собой текстовый / обычный файл в кодировке us_ascii)

try{
header("Content-type: text/plain; charset=utf-8", true);

$filename = "ahstray.obj";
$file_content = file_get_contents($filename);
$file_hash = hash_file('sha512', $filename, false);
$bits = pack("H*", $file_hash);
$file_hash = base64_encode($bits);
$filesize = strlen($file_content); //filesize($filename); //strlen(file_get_contents($filename));

$boundary = "uuid:".uniqid();
$headers = array(
'MIME-Version: 1.0',
'Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="'.$boundary.'";start-info="text/xml"',
'SOAPAction: "'.$action.'"',
'Host: www.url.com',
'Content-length: '.$filesize,
'Accept-Encoding: gzip, deflate',
'User-Agent: PHP-Post-FileUpload'
);
$post_data = "\r\n\r\n\r\n--{$boundary}\r\n";
$post_data .= "Content-ID: <http://tempuri.org/0>\r\n";
$post_data .= "Content-Transfer-Encoding: 8bit\r\n";
$post_data .= 'Content-Type: application/xop+xml;charset=utf-8;type="text/xml"';
$post_data .= "\r\n\r\n";

$post_data .= '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">';
$post_data .= '<s:Header>';
$post_data .= '<h:FileHash xmlns:h="http://www.materialise.be/eRP">'.$file_hash.'</h:FileHash>';
$post_data .= '<h:FileName xmlns:h="http://www.materialise.be/eRP">'.$filename.'</h:FileName>';
$post_data .= '<h:FileSize xmlns:h="http://www.materialise.be/eRP">'.$filesize.'</h:FileSize>';
$post_data .= '<h:UserDomain xmlns:h="http://www.materialise.be/eRP">'.$domain.'</h:UserDomain>';
$post_data .= '<h:UserName xmlns:h="http://www.materialise.be/eRP">'.$gebruiker.'</h:UserName>';
$post_data .= '<h:UserPassword xmlns:h="http://www.materialise.be/eRP">'.$encrypted_password.'</h:UserPassword>';
$post_data .= '</s:Header>';
$post_data .= '<s:Body>';
$post_data .= '<UploadFileDTO xmlns="http://www.url.com/eRP">';
$post_data .= '<FileStream>';
$post_data .= '<xop:Include href="cid:http://tempuri.org/1/635551016730489495" xmlns:xop="http://www.w3.org/2004/08/xop/include" />';
$post_data .= '</FileStream>';
$post_data .= '</UploadFileDTO>';
$post_data .= '</s:Body>';
$post_data .= '</s:Envelope>';

$post_data .= "\r\n--{$boundary}\r\n";
$post_data .= "Content-ID: <http://tempuri.org/1/635551016730489495>\r\n";
$post_data .= "Content-Transfer-Encoding: binary\r\n";
$post_data .= "Content-Type: application/octet-stream\r\n\r\n";

$post_data .= $file_content.$file_content;
$post_data .= "--{$boundary}\r\n";$sock = fsockopen("ssl://www.url.com", 443, $errorno, $error, 30) or die($error);
$data = "POST https://www.url.com/FilesTransfer.svc HTTP/1.1\r\n";
$data .= implode("\r\n", $headers);
$data .= $post_data;

if($sock){
fwrite($sock, $data);
echo fread($sock, strlen($data));
fflush($sock);
fclose($sock);
}

/*
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$error = curl_error($ch);

print_r_pre($response);
print_r_pre($error);
curl_close($ch);
*/

} catch (Exception $e){
print('<pre>');
print_r($e);
print('</pre>');
}

0

Решение

Таким образом, решение этой проблемы просто. Это многочастичный запрос, что означает, что когда вы устанавливаете «Content-length», вы должны рассчитать полный размер запроса. Итак, часть XML и размер файла, который вы пытаетесь загрузить.

Запрос теперь будет выглядеть так:

try{

$file_content = utf8_encode(file_get_contents($filename));
$hash = hash('sha512', $file_content, false);
$bits = pack("H*", $hash);
$file_hash = base64_encode($bits);
$filesize = filesize($filename); //filesize($filename); //strlen(file_get_contents($filename));

$boundary = "uuid:".uniqid();

$xml_request = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">';
$xml_request .= '<s:Header>';
$xml_request .= '<h:FileHash xmlns:h="http://www.materialise.be/eRP">'.$file_hash.'</h:FileHash>';
$xml_request .= '<h:FileName xmlns:h="http://www.materialise.be/eRP">'.$filename.'</h:FileName>';
$xml_request .= '<h:FileSize xmlns:h="http://www.materialise.be/eRP">'.$filesize.'</h:FileSize>';
$xml_request .= '<h:UserDomain xmlns:h="http://www.materialise.be/eRP">'.$this->domain.'</h:UserDomain>';
$xml_request .= '<h:UserName xmlns:h="http://www.materialise.be/eRP">'.$this->gebruiker.'</h:UserName>';
$xml_request .= '<h:UserPassword xmlns:h="http://www.materialise.be/eRP">'.$this->encrypted_password.'</h:UserPassword>';
$xml_request .= '</s:Header>';
$xml_request .= '<s:Body>';
$xml_request .= '<UploadFileDTO xmlns="http://www.url.com/eRP">';
$xml_request .= '<FileStream>';
$xml_request .= '<xop:Include href="cid:http://tempuri.org/1/635551016730489495" xmlns:xop="http://www.w3.org/2004/08/xop/include" />';
$xml_request .= '</FileStream>';
$xml_request .= '</UploadFileDTO>';
$xml_request .= '</s:Body>';
$xml_request .= '</s:Envelope>';

$headers = array(
'MIME-Version: 1.0',
'Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="'.$boundary.'";start-info="text/xml"',
'SOAPAction: "http://www.url.com/UploadFile"',
'Host: www.url.com',
'Accept-Encoding: gzip, deflate',
'Connection: Keep-Alive'
);

$post_data = "--{$boundary}\r\n";
$post_data .= "Content-ID: <http://tempuri.org/0>\r\n";
$post_data .= "Content-Transfer-Encoding: 8bit\r\n";
$post_data .= 'Content-Type: application/xop+xml;charset=utf-8;type="text/xml"';
$post_data .= "\r\n\r\n";

$post_data .= $xml_request;

$post_data .= "\r\n--{$boundary}\r\n";
$post_data .= "Content-ID: <http://tempuri.org/1/635551016730489495>\r\n";
$post_data .= "Content-Transfer-Encoding: binary\r\n";
$post_data .= "Content-Type: application/octet-stream\r\n\r\n";

$headers[] = "Content-length: ".($filesize+strlen($post_data));

$post_data .= $file_content;
$post_data .= "--{$boundary}\r\n";

$ch = curl_init($this->wsdl_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$error = curl_error($ch);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]