PHP fwrite() не работает

Я пишу функцию на php, на стороне клиента у меня есть изображение холста, которое я использую toDataUrl() вместе с именем файла для сохранения изображения на сервере. Вот код:

<?php
  $imageData=$GLOBALS['HTTP_RAW_POST_DATA'];
  $data = json_decode($imageData, true);

  $file = $data["file"];
  $image = $data["data"];

  $filteredData=substr($image, strpos($image, ",")+1);
  $unencodedData=base64_decode($filteredData);

  $fp = fopen( 'image/' . $file , 'wb' );
  fwrite( $fp, $unencodedData);
  fclose( $fp );
?>

Дело в том, что этот код работает. И на двух из трех страниц, которые я использовал, он работает нормально. Проблема в том, что когда я копирую и вставляю его в третий раз, чтобы снова реализовать, по какой-то причине файл создается на сервере, за исключением того, что данные не записываются в файл. Я не думаю, что это проблема на стороне клиента, потому что я пишу сообщение об отладке в javascript и отладочное эхо в PHP, и оба могут нормально распечатать данные. Я сделал этот короткий файл отладки:

<?php
$fp = fopen('data.txt', 'wb');
if(is_writable('data.txt')){
    echo "file is writable<br>";
}
if(fwrite($fp, 'test') == FALSE){
    echo "failed to write data<br>";
}
fclose($fp);
?>

И выход

file is writable
failed to write data

Я пробовал использовать chmod и настраивать все, папку, текстовый файл, прежде чем писать в него на 0777, и все равно получаю тот же результат; файл создается, но в него не записываются данные. Есть ли что-то, что мне не хватает, или какие-либо другие подходы, которые могут помочь. Я ничего не нашел в Google и до сих пор не понимаю, почему один и тот же код дважды работал точно так, как ожидалось, прежде чем внезапно остановиться без видимой причины.

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


person Benjamin Collins    schedule 17.01.2013    source источник


Ответы (3)


Я знаю, что это старый пост, но у меня была очень похожая проблема, и я нашел решение (по крайней мере, для себя)! У меня закончилось место на диске на моем сервере, поэтому он мог создать файл размером 0 байт, но не записывался в него. После того, как я очистил место (удалив файл error.log размером 13 ГБ), все снова заработало, как и ожидалось.

Если fopen работает, а fwrite почему-то нет, проверьте место на диске. «df -h» — это команда для проверки дискового пространства на сервере Linux.

person Masstell    schedule 16.01.2014
comment
спасибо #Masstell , fwrite таинственным образом перестал работать на моем сервере, и это было по причине, которую вы только что упомянули :) - person richardtk_1; 08.05.2014
comment
У меня также была эта проблема, забыл, что решение может быть таким простым... - person Finlay Roelofs; 16.02.2017

вместо $fp = fopen('data.txt', 'wb'); дайте $fp = fopen('data.txt', 'w'); и попробуйте

Изменено "wb" на "w"

person Prasanth Bendra    schedule 17.01.2013
comment
Спасибо за ответ! Изменил его на w и добавил в chmod(file, 0777); Удалил файл, попробовал еще раз. Файл создан, все еще 0 байт. Попробовал еще раз, чтобы увидеть, пишет ли он в файл. По-прежнему 0 байт, в файл ничего не записывается. - person Benjamin Collins; 17.01.2013
comment
@Prasanth Что произойдет, если вы, например, измените свой параметр «wb» на «w +»? - person Tash Pemhiwa; 17.01.2013
comment
либо «w», либо «w +», вы должны иметь возможность писать в файл. Поскольку вы не можете писать на него с помощью «w», я думаю, что «w +» не будет иметь никакого значения. - person Prasanth Bendra; 17.01.2013
comment
@PrasanthBendra Мое предложение было больше об удалении буквы «b», чем о чем-либо еще. Разве это не влияет? - person Tash Pemhiwa; 18.01.2013
comment
Изменение его на w не имело никакого эффекта. Пробовал, тоже самое, файл сделал, но пустой. - person Benjamin Collins; 19.01.2013
comment
повторить ваши $unencodedData и увидеть, есть ли там какие-либо данные, и echo fwrite($fp, $unencodedData); это даст вам длину данных, записанных в файл. - person Prasanth Bendra; 21.01.2013

Когда вы пишете $fp = fopen('data.txt', 'w'); для своего домена Website.com, имеющего корень в /var/www/website/, и если файл php находится в /var/www/website/php/server/file/admin.php или чем-то подобном, он будет на самом деле создайте файл в /var/www/website/data.txt

Попробуйте указать абсолютный путь или путь относительно корня вашего домена, чтобы создать такие файлы, как

$fp = fopen('php/server/file/data.txt', 'w');

Попробуйте найти команду, чтобы увидеть, создан ли файл где-либо еще в каталоге папки, используя следующее в Ubuntu:

найти /var/www/website/ -name 'data.txt'

У меня была эта проблема, возможно, я могу помочь вам решить, если у вас есть аналогичная проблема.

person Krishna Modi    schedule 24.08.2017