2015-07-24 2 views
6

Я звоню к API, который посылает мне этот ответ:Curl: Сохранение файла вместо открытия его

HTTP/1.1 200 OK\r\n 
Date: Fri, 24 Jul 2015 06:30:16 GMT\r\n 
Server: Apache/2.2.26 (Unix) mod_ssl/2.2.26 OpenSSL/0.9.8e-fips-rhel5 mod_mono/2.6.3 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.4.22 mod_perl/2.0.6 Perl/v5.8.8\r\n 
X-Powered-By: PHP/5.4.22\r\n 
Expires: \r\n 
Cache-Control: max-age=0, private\r\n 
Pragma: \r\n 
Content-Disposition: attachment; filename="LVDox-Master.docx"\r\n 
X-Content-Type-Options: nosniff\r\n 
ETag: d41d8cd98f00b204e9800998ecf8427e\r\n 
Content-Length: 68720\r\n 
Vary: Accept-Encoding,User-Agent\r\n 
Connection: close\r\n 
Content-Type: application/octet-stream\r\n 
\r\n 
PK\x03\x04\x14\x00\x06\x00\x08\x00\x00\x00!\x000\x1FÎò¡\x01\x00\x00ß\x08\x00\x00\x13\x00\x08\x02[Content_Types].xml ¢\x04\x02(\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ 
... 
... (etc) 

Если я использую этот код файл отправляется пользователю, и все работает отлично:

list($headers, $content) = explode("\r\n\r\n", $result ,2); 
foreach (explode("\r\n",$headers) as $header) 
{ 
    header($header); 
} 

//return the nonheader data 
return trim($content); 

Но сейчас, я хотел бы сохранить файл в другом месте, чтобы мой сценарий мог работать над ним (переименовать его и т. Д.), Поэтому я не хочу напрямую отправлять его пользователю.

Я попытался прокомментировать header($header); часть, и сделать что-то вроде:

$content = getMyFile(); 
$file = fopen('MYTEST.docx', "w+"); 
fputs($file, $content); 
fclose($file); 

Но полученный файл не читается (это, кажется, поврежден).

У вас есть идеи, что может вызвать эту проблему?

Заранее спасибо.

+0

данные записываются в файл? т. е. можете ли вы проверить количество написанных байт, что вы ожидали, или это ничего не пишет? –

+0

Да У меня есть файл размером 69 КБ. Но этот файл неверен (его нельзя открыть). Но если я храню заголовки, все работает нормально, но файл отправляется пользователю. Значит, заголовки могут быть важны? – Vico

+0

Попробуйте использовать 'fwrite' вместо' fputs' - поскольку вы имеете дело с двоичными данными. В качестве альтернативы, почему бы не просто «file_put_contents»? –

ответ

1

Вам необходимо указать длину содержимого для fputs, чтобы он был двоичным.

В этом случае вы можете попробовать fputs($file, $content, 68720);

И в конечном счете обеспечить длину от заголовка.

Также я предлагаю открыть файл в двоичном режиме, используя fopen('MYTEST.docx', "wb");, особенно если вы используете свой код в Windows.

+0

Спасибо, ваше решение решило мою проблему! – Vico

Смежные вопросы