0

My problem here is even though it gets saved "successfully" the file is not actually saved. (I'm running this on the Cloud9IDE)

My folder exports is set to be readable and writable via chmod 777 -R ./.

Can someone explain to me why the hello.txt file is not being created, and what I can do to solve this problem?

JQuery:

$("[data-action=save-file]").on("click", function(e) {
  var filename = "hello.txt"
  var content = "Hello world!"

  $.ajax({
    type: "GET",
    url: "submit.php",
    data: {
      "filename": filename,
      "content": content,
    },
    cache: false,
    success: function(msg) {
      console.log(msg)
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
      console.log("Some error occurred")
    }
  })
})

PHP:

<?php
  $filename = $_GET["filename"];
  $fp = fopen("anon/".$filename, "wb");
  if (!$fp) {
    echo getcwd();
    exit;
  } else {
    $outputstring = $_GET["outputstring"];
    fwrite($fp, $outputstring);
  }
  $fclose($fp);
?>

I've also tried...

<?php
  $filename = $_GET["filename"];
  $outputstring = $_GET["outputstring"];
  file_put_contents($filename, $outputstring, FILE_APPEND | LOCK_EX);
?>
Michael Schwartz
  • 8,153
  • 14
  • 81
  • 144
  • 1
    Try using [`file_put_contents()`](http://php.net/manual/en/function.file-put-contents.php) which just gives less headache ;) – Bobot Mar 18 '16 at 08:44
  • 1
    What message does the site echo? Also, remember to close $fp – 25r43q Mar 18 '16 at 08:45
  • 1
    Is PHP echoing "Cannot generate file"? I would try to check what's your current working directory `getcwd()` to see if you're trying to write where you're expecting – Alessandro Mar 18 '16 at 08:46
  • is anon is a directory?if it is..,then check the permission of that folder..make it to writable.dont forget to close the file pointer also.try again – Jasmel Pc Mar 18 '16 at 08:56
  • also **do not** `alert()` in `success` and `error` because it blocks main UI since ajax is asynchronous. I find better practice is to use `console.log()` –  Mar 18 '16 at 08:58
  • I used the code on my own website switching the `$("[data-action=save-file]")` portion to `$(document).ready` to test it and the file was created properly. Maybe it is a permissions thing as Jasmel said. Don't know if me testing it helps at all. – lovermanthing Mar 25 '16 at 20:39

4 Answers4

1

If this is the actual code that is posted, then the arguments being sent by ajax are "content" and "filename", while php is expecting "outputstring" and "filename", so, on the php end, there is no "outputstring" and the program doesn't check for "content" in $_GET.

$filename = $_GET["filename"];
$outputstring = $_GET["content"];
file_put_contents($filename, $outputstring, FILE_APPEND | LOCK_EX);

Also there is a max length to too url parameters for GET (Max size of URL parameters in _GET), so if file content is ever an actual file this may be truncated. Try using type: "POST" instead.

Community
  • 1
  • 1
gmfm
  • 659
  • 8
  • 21
1

maybe you should start debugging server side: first of all, when using file_put_contents, check if it returns false (use operator ===). In this case folder anon/ doesn't exists. second: check for writability of that folder with is_writable.

if (!isset($_GET[...], $_GET[...])) die("missing vars...");
if (!is_writable($filenamewithpath)) die("dir not writable");
if (file_put_contents(...) === false) die("dir doesn't exists");

if directory not writable, try using chmod($path, 0777). could be that your main directory is 0777 but not the sub-directories.

by the way, as others pointed out, your ajax call is sending "content", not "outputstring" as parameter. you should rename the data object key.

try also to use absolute path (using for example __DIR__ . "/anon/". $filename);

Nereo Costacurta
  • 7,693
  • 4
  • 21
  • 27
0

The code in php $fp.close() is error. It should be fclose($fp).

liyj144
  • 110
  • 7
-2

wb is not any mode in php. use w+ instead of wb

and you need to check folder is exist or not

   $path = "anon";
   if (!file_exists($path) && is_dir($path))
   {
        if (!mkdir($path, 0777, TRUE))
        {
            return false;
        }
   }
Hardeep Singh
  • 743
  • 1
  • 8
  • 18