Я пытаюсь узнать, как передавать файлы (.zip-файлы) между клиентом и сервером с помощью PHP и SOAP. В настоящее время у меня есть настройка, которая выглядит примерно так:
require('libraries/nusoap/nusoap.php'); $server = new nusoap_server; $server->configureWSDL('server', 'urn:server'); $server->wsdl->schemaTargetNamespace = 'urn:server'; $server->register('sendFile', array('value' => 'xsd:string'), array('return' => 'xsd:string'), 'urn:server', 'urn:server#sendFile');
Но я не уверен, что должен быть тип возврата, если не строка? Я думаю использовать base64_encode
.
Чтобы быть более ясным, я опубликовал как код server.php, так и код client.php. См. Ниже:
require_once('lib/nusoap.php'); //include required class for build nnusoap web service server // Create server object $server = new soap_server(); // configure WSDL $server->configureWSDL('Upload File', 'urn:uploadwsdl'); // Register the method to expose $server->register('upload_file', // method array('file' => 'xsd:string','location' => 'xsd:string'), // input parameters array('return' => 'xsd:string'), // output parameters 'urn:uploadwsdl', // namespace 'urn:uploadwsdl#upload_file', // soapaction 'rpc', // style 'encoded', // use 'Uploads files to the server' // documentation ); // Define the method as a PHP function function upload_file($encoded,$name) { $location = "uploads\\".$name; // Mention where to upload the file $current = file_get_contents($location); // Get the file content. This will create an empty file if the file does not exist $current = base64_decode($encoded); // Now decode the content which was sent by the client file_put_contents($location, $current); // Write the decoded content in the file mentioned at particular location if($name!="") { return "File Uploaded successfully..."; // Output success message } else { return "Please upload a file..."; } } // Use the request to (try to) invoke the service $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; $server->service($HTTP_RAW_POST_DATA);
================================================== ===================
require_once('lib/nusoap.php'); //include required class for build nnusoap web service server $wsdl="http://localhost:81/subhan/webservice3/server.php?wsdl"; // SOAP Server if($_POST['submit']) { $tmpfile = $_FILES["uploadfiles"]["tmp_name"]; // temp filename $filename = $_FILES["uploadfiles"]["name"]; // Original filename $handle = fopen($tmpfile, "r"); // Open the temp file $contents = fread($handle, filesize($tmpfile)); // Read the temp file fclose($handle); // Close the temp file $decodeContent = base64_encode($contents); // Decode the file content, so that we code send a binary string to SOAP } $client=new soapclient($wsdl) or die("Error"); // Connect the SOAP server $response = $client->__call('upload_file',array($decodeContent,$filename)) or die("Error"); //Send two inputs strings. {1} DECODED CONTENT {2} FILENAME // Check if there is anny fault with Client connecting to Server if($client->fault){ echo "Fault {$client->faultcode} <br/>"; echo "String {$client->faultstring} <br/>"; } else{ print_r($response); // If success then print response coming from SOAP Server } <form name="name1" method="post" action="" enctype="multipart/form-data"> <input type="file" name="uploadfiles"><br /> <input type="submit" name="submit" value="uploadSubmit"><br /> </form>
=================================================
Все, что вам нужно сделать, это загрузить nusoap.php, который будет отображаться в библиотеке мыла http://sourceforge.net/projects/nusoap/
Это полностью проверено, и он будет на 100% работать без сбоев.
Перенос файлов по SOAP – это то, что получает каждый первый раз (включая меня). Вам нужно открыть и прочитать документ, а затем передать его как строку. Вот как я это сделаю.
$handle = fopen("mypackage.zip", "r"); $contents = fread($handle, filesize("mypackage.zip")); fclose($handle); //$contents now holds the byte-array of our selected file
Затем отправьте $ contents в качестве своей строки через SOAP и соберите ее с другой стороны.
В client.php измените это:
if($_POST['submit']) { ... } $client=new soapclient($wsdl) or die("Error"); // Connect the SOAP server $response = $client->__call('upload_file',array($decodeContent,$filename)) or die("Error"); //Send two inputs strings. {1} DECODED CONTENT {2} FILENAME
к этому:
if($_POST['submit']) { ... $client=new soapclient($wsdl) or die("Error"); // Connect the SOAP server $response = $client->__call('upload_file',array($decodeContent,$filename)) or die("Error"); //Send two inputs strings. {1} DECODED CONTENT {2} FILENAME }