I´ve run into a problem with a script I´m using.. The script is "Thin Slice Upload". The script is a uploadscript but with the difference that it splices upp the uploaded file into many files, then uploads, then puts them together on the server to go around the "max_upload_size"-parameter within php.ini (as I don´t have the ability to change this). BUT I´ve got One.com and everything I´ve tried it still doesn´t upload the file or files. Neither the uploaded file or the temporarary hash-files exists on the server even if the java-applet "uploads" the file 100% it still doesn´t exist anywhere. First I thought that the problem was with the "$save_path" but when I tried to run the php-file it checks to see if the folder exists and if it can write a file to it (shown in the bottom of the code). This works and it writes the text-file to the folder without any problem. So the problem is not with the folder och folderpath but that the "splicefiles" never even get´s "posted". Does this php-code upload a file that it gets from a "POST" ? Or does the java-applet upload the file and this php-code only "puts the files together" ? Please, please I beg of everyone to help me with this More info and a downloadable demo is available at http://upload.thinfile.com/resume/ <?php /** * Resumable file upload: * * When a collection of files is about to be uploaded, Thin Slice * Upload will send a zero byte request but the query string will have * a parameter named 'cmd' with a value of 0. * * The request may or may not include a hash code. If a hash code is * included, that means we are attempting to resume failed/paused * transfer of multiple files. Some files may have been completely * uploaded - some may have be partially uploaded. * * When a hash is not included this script will generate one and send * it back to the client. All future requests in this transfer need to * include this hash code in the query string. * * Before each file is uploaded, another empty request with a 'cmd' of * 1 has to be sent to the script. The script must then return the * number of bytes that have been previously written for that file. -1 * will be the response if an error has occured. 0 will be returned if * this is the first attempt to upload the file in question. * * When all the files have been uploaded another zero byte request will * be made. This time cmd parameter will be set to 2 - meaning that we * have finished uploading the files. Now the script should send a * nicely formatted reply and move the files to a permanent location. * * Last but not least when the upload was interrupted we have another * response, in this case cmd=3 */ /** * Copyright Rad Inks (Pvt) Ltd. 2005-2006. * Reproduced with permission of the copyright owner. Further * reproduction prohibited without permission. **/ /* * The top level folder for saving files. It should be a folder * that the web server can write to. The path should end with a * '/'. * examples: * d:/uploaded/ * /home/thinfile/uploaded/ */ $save_path="/Robin/"; $log_file=""; if($_SERVER['REQUEST_METHOD'] == 'PUT') { /* * determine the filename by stripping out the script name. */ //log_error("Script Name = {$_SERVER["SCRIPT_NAME"]} and Self = {$_SERVER["PHP_SELF"]}"); $fname = str_replace($_SERVER["SCRIPT_NAME"],"",$_SERVER["PHP_SELF"]); $fname = str_replace("+"," ",$fname); } else { /* * With post the filename is in the query string. */ $fname = (isset($_REQUEST['fname'])) ? $_REQUEST['fname'] : ""; } /* * Retrieve the hash if it has been sent. */ $hash = (isset($_REQUEST['hash'])) ? $_REQUEST['hash'] : ""; /* * if an absolute path is sent, it may contain double '//' because the * filename is appended to the scriptname with a '/' and not a '?' */ $pos = strpos($fname,'//'); if($pos !== false && $pos == 0) { $fname = substr($fname,1); } if(isset($_REQUEST['userfile_parent'])) { /* * the top level folder on te client computer. */ $userfile_parent = preg_quote($_REQUEST['userfile_parent'],"|"); $fname = preg_replace("|{$userfile_parent}|","",$fname); } $windbag = isset($_ENV['OS']) ? stristr($_ENV['OS'],'windows') : 0 ; /* log_error("fname = $fname"); log_error("SELF =" .$_SERVER["PHP_SELF"] ); log_error("SCRIPT_NAME =" .$_SERVER["SCRIPT_NAME"] ); log_error("URI =" .$_SERVER["REQUEST_URI"] ); log_error("\nuserfile_parent = " . $userfile_parent); log_error("HASH = $hash"); */ function log_error($err) { global $log_file; if($log_file != '') { error_log("\n$err", 3, $log_file); } else { error_log($err); } } /** * Finds all the files that have been uploaded, moves them to * a permanent location, prepares server response. */ function find_files($path,$move=1) { global $hash; if($move==1) { $newPath = str_replace("{$hash}/","",$path); } //log_error("Find Files in - $path"); if (file_exists($path) && ($handle = opendir($path))) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $rel_path=$path . $file; if(is_dir($rel_path)) { if($move == 1 && !is_dir($newPath . $file)) { mkdir($newPath . $file); } find_files("$rel_path/"); } else { if($move == 1) { rename($rel_path,$newPath . $file); //log_error("Trying to move from {$rel_path} to {$newPath}{$file}"); } echo "<tr><td>$file</td><td>". filesize($newPath . $file) . "</td></tr>"; } } } closedir($handle); if($move == 1) { rmdir($path); } } } /** * mimic `mkdir -p` for windows systems. */ function mkdir_p($path, $mode = 0700) { $dirs = split("/",$path); $path = $dirs[0]; for($i = 1;$i < count($dirs);$i++) { $path .= "/".$dirs[$i]; if(!is_dir($path)) { mkdir($path,$mode); } } } if(isset($_REQUEST['cmd'])) { $cmd = $_REQUEST['cmd']; //log_error("\n Init = {$_REQUEST['cmd']}"); switch ($cmd) { case 0: /* * The client wants upload a bunch of files. Since the * client does not have a previously generated hashcode * we make a new one. To be able to validate the has we * prefix it with 0, and suffix it with 1. */ if(!isset($hash) || trim($hash) == '') { $hash ="0". uniqid(rand() . rand(), false) ."1"; //log_error("Sending HASH = {$hash}"); } echo "$hash\n"; break; case 1: /* * trying to find out if this particular file has been * uploaded before. */ if(file_exists("{$save_path}{$hash}/{$fname}")) { //log_error("Sending filesize " . filesize("{$save_path}{$hash}/{$fname}") ."\n"); echo filesize("{$save_path}{$hash}/{$fname}"); } else { echo "00\n"; //log_error("No resumption needed for" . "{$save_path}{$hash}/{$fname}"); } break; case 2: /* * all the files in this transfer have been uploaded. */ // log_error('Make Perm: '); require_once('head.txt'); find_files("{$save_path}{$hash}/"); require_once('foot.txt'); break; case 3: /* * Some files may not have been uploaded and/or some may have been partially uploaded. */ require_once('head.txt'); echo '<tr><td colspan=2>File Upload Was Interrupted.</td></tr>'; // log_error('find files 1'); find_files("{$save_path}{$hash}/",0); require_once('foot.txt'); break; } } else { if($fname != '') { //log_error('The data comes in, the file name is ' . $fname); /* PUT data comes in on the stdin stream */ $putdata = fopen("php://input","r"); $save_path .= "{$hash}/"; $path ="$save_path" . dirname($fname); //log_error('save file in = ' . $save_path); if(preg_match('/(;)|(\.\.)/',$path)) { echo "$path rejected"; exit; } else { if(file_exists($path)) { if(!is_dir($path)) { /* * a file by that name already exists and it's not a directory. * You will need to handle this situation according to your * requirements. You have a range of options including siliently * ingoring this file or rejecting the upload as a whole. */ //log_error("file exists $path"); } } else { // log_error('making path ' . $path); if($windbag) { mkdir_p($path,777); } else { `mkdir -p "$path"`; } } } $offset = $_REQUEST['offset']; $fname = $save_path . $fname; if(isset($offset) && $offset > 0 && $offset <= filesize($fname)) { //log_error("APPEND , Offset = $offset"); $fp = fopen($fname,"a+"); fseek($fp,$offset); } else { $fp = fopen($fname,"wb"); } /* Read the data 1kb at a time and write to the file */ while (!feof($putdata)) { $data = fread($putdata,1024); fwrite($fp,$data); } /* Close the streams */ /******************************************************************* * ADD CODE TO CUSTOMIZE THE SCRIPT BEHAVIOUR HERE *******************************************************************/ fclose($fp); fclose($putdata); echo '1'; } else { $fp = @fopen("{$save_path}trysavingafile.txt","a+"); //log_error($fp); if($fp) { echo 'Please open japplet.html in your browser to start an upload.'; } else { echo 'The folder you have chosen cannot be written to'; } } } ?> PHP: