Simplexml_load_string可以直接链接到XML文件,但不能与file_get_contents('php:// input')一起使用

Searched a lot for this on StackOverflow and Google but can't seem to find an answer to this specific situation

I'm working with a client that sends me an XML file via PHP POST and this is the code I use:

$xml = file_get_contents('php://input');
$xmlStripped = stripslashes($xml);
$xmlContent = simplexml_load_string($xmlStripped);
print_r($xmlContent);

For testing I also uploaded the XML file directly to my server and did it like this:

$xml = file_get_contents('http://www.site.com/linktoxml.xml');
$xmlStripped = stripslashes($xml);
$xmlContent = simplexml_load_string($xmlStripped);
print_r($xmlContent);

And then it works fine, it prints out the XML as an object.

The form I use to upload is like this:

<form action="http://app.site.com/upload" method="POST">
<input type="file" name="file" id="file ">
<input type="submit" value="upload">
</form>

file_get_contents('php://input'); would normally give you the raw RFC 1867 data, not the file itself. The file data is enveloped inside this request data. In your case, it gives an empty string because PHP discards such data after processing it in order to save memory.

PHP, however, automatically processes and decodes the RFC 1867 data. What you have to do is (besides validating that $_FILES['file']['tmp_name'] exists and is a string):

$xml = file_get_contents($_FILES['file']['tmp_name']);

Try using the actual file from

$_FILES['userfile']['tmp_name'] 

instead of the

"php://input"

If you insist on using the php://input, try this hack