Question

I have the following code to create a LOG file.

It is implemented inside "download.php", a script to force download which I call from download links such as:

<a href="download.php?file=filename">Filename to download</a>

Download links are at any other page, index.php, or whatever. Works fine at my local server, doesn't work at my hosting (GoDaddy)...

$fname = "filename";

// log file name
define('LOG_FILE','logs/downloads.log');

$f = fopen(LOG_FILE, "a+");
if ($f) {
  fputs($f, date("Y.m.d | H:i:s")." | ".$_SERVER['REMOTE_ADDR']." | ".$fname."\r\n");
  fclose($f);
}

The same code inside a different file, also works perfectly.

I suppose that something inside the download.php script interferes with it, I could put it here if necessary, but its long...

Thanks!!

The full code for download.php:

<?php

###############################################################
# File Download 1.31
###############################################################
# Visit http://www.zubrag.com/scripts/ for updates
###############################################################
# Sample call:
#    download.php?f=phptutorial.zip
#
# Sample call (browser will try to save with new file name):
#    download.php?f=phptutorial.zip&fc=php123tutorial.zip
###############################################################

// Allow direct file download (hotlinking)?
// Empty - allow hotlinking
// If set to nonempty value (Example: example.com) will only allow downloads when referrer contains this text
define('ALLOWED_REFERRER', '');

// Download folder, i.e. folder where you keep all files for download.
// MUST end with slash (i.e. "/" )
define('BASE_DIR','mp3');

// log downloads?  true/false
define('LOG_DOWNLOADS',true);

// log file name
define('LOG_FILE','logs/downloads.log');

// Allowed extensions list in format 'extension' => 'mime type'
// If myme type is set to empty string then script will try to detect mime type 
// itself, which would only work if you have Mimetype or Fileinfo extensions
// installed on server.
$allowed_ext = array (

  // archives
  'zip' => 'application/zip',

  // documents
  'pdf' => 'application/pdf',
  'doc' => 'application/msword',
  'xls' => 'application/vnd.ms-excel',
  'ppt' => 'application/vnd.ms-powerpoint',

  // executables
  'exe' => 'application/octet-stream',

  // images
  'gif' => 'image/gif',
  'png' => 'image/png',
  'jpg' => 'image/jpeg',
  'jpeg' => 'image/jpeg',

  // audio
  'mp3' => 'audio/mpeg',
  'wav' => 'audio/x-wav',

  // video
  'mpeg' => 'video/mpeg',
  'mpg' => 'video/mpeg',
  'mpe' => 'video/mpeg',
  'mov' => 'video/quicktime',
  'avi' => 'video/x-msvideo'
);



####################################################################
###  DO NOT CHANGE BELOW
####################################################################

// If hotlinking not allowed then make hackers think there are some server problems
if (ALLOWED_REFERRER !== ''
&& (!isset($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper(ALLOWED_REFERRER)) === false)
) {
  die("Internal server error. Please contact system administrator.");
}

// Make sure program execution doesn't time out
// Set maximum script execution time in seconds (0 means no limit)
set_time_limit(0);

if (!isset($_GET['f']) || empty($_GET['f'])) {
  die("Please specify file name for download.");
}

// Nullbyte hack fix
if (strpos($_GET['f'], "\0") !== FALSE) die('');

// Get real file name.
// Remove any path info to avoid hacking by adding relative path, etc.
$fname = basename($_GET['f']);

// Check if the file exists
// Check in subfolders too
function find_file ($dirname, $fname, &$file_path) {

  $dir = opendir($dirname);

  while ($file = readdir($dir)) {
    if (empty($file_path) && $file != '.' && $file != '..') {
      if (is_dir($dirname.'/'.$file)) {
        find_file($dirname.'/'.$file, $fname, $file_path);
      }
      else {
        if (file_exists($dirname.'/'.$fname)) {
          $file_path = $dirname.'/'.$fname;
          return;
        }
      }
    }
  }

} // find_file

// get full file path (including subfolders)
$file_path = '';
find_file(BASE_DIR, $fname, $file_path);

if (!is_file($file_path)) {
  die("File does not exist. Make sure you specified correct file name."); 
}

// file size in bytes
$fsize = filesize($file_path); 

// file extension
$fext = strtolower(substr(strrchr($fname,"."),1));

// check if allowed extension
if (!array_key_exists($fext, $allowed_ext)) {
  die("Not allowed file type."); 
}

// get mime type
if ($allowed_ext[$fext] == '') {
  $mtype = '';
  // mime type is not set, get from server settings
  if (function_exists('mime_content_type')) {
    $mtype = mime_content_type($file_path);
  }
  else if (function_exists('finfo_file')) {
    $finfo = finfo_open(FILEINFO_MIME); // return mime type
    $mtype = finfo_file($finfo, $file_path);
    finfo_close($finfo);  
  }
  if ($mtype == '') {
    $mtype = "application/force-download";
  }
}
else {
  // get mime type defined by admin
  $mtype = $allowed_ext[$fext];
}

// Browser will try to save file with this filename, regardless original filename.
// You can override it if needed.

if (!isset($_GET['fc']) || empty($_GET['fc'])) {
  $asfname = $fname;
}
else {
  // remove some bad chars
  $asfname = str_replace(array('"',"'",'\\','/'), '', $_GET['fc']);
  if ($asfname === '') $asfname = 'NoName';
}

// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$asfname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// download
// readfile($file_path);
$file = fopen($file_path,"rb");
if ($file) {
  while(!feof($file)) {
    print(fread($file, 1024*8));
    flush();
    if (connection_status()!=0) {
      fclose($file);
      die();
    }
  }
  fclose($file);
}

// log downloads
if (!LOG_DOWNLOADS) die("Not logging downloads");

$f = fopen(LOG_FILE, "a+");
if ($f) {
  fputs($f, date("Y.m.d | H:i:s")." | ".$_SERVER['REMOTE_ADDR']." | ".$fname."\r\n");
  fclose($f);
}

?>
Was it helpful?

Solution

Do you have a 'logs' folder in your web server? If you do, check its permissions. If it's not 755, set it to 755. If you don't have the logs folder, then just create one.

I've encountered similar problems before and usually the reason is the directory does not exist in the server.

Edit: Can you try:

file_put_contents('logs/test.log','nothing is wrong');

If the file appeared and it was successfully written, then I suggest that you update your code to use that function instead.

OTHER TIPS

There could be several things which are wrong:

  • Do you have permissions for the file? - Make sure your chmod settings on that file allow the server to have read/write permissions. Generally, it's 755 or 777 or similar.
  • Do the folder/file exist? - Should be rather straightforward, check if the folder actually exist in the location you think it does. It should be on the same folder as the PHP script accessing it.
  • Have your host disabled file related operations? - check with GoDaddy's manual and documentation, or contact their support regarding this if all else fails.

Things to help you determine the problem:

  • Enable error reporting. - Calling error_reporting(E_ALL); at the top of the PHP page will reveal any errors/warnings/notices you may have from the script. Hosts like GoDaddy usually disable them by default.

You might need to chmod the file to 755 or something similar.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top