Cable Forum

Cable Forum (https://www.cableforum.uk/board/index.php)
-   General IT Discussion (https://www.cableforum.uk/board/forumdisplay.php?f=19)
-   -   PHP Help! (https://www.cableforum.uk/board/showthread.php?t=25632)

Strzelecki 14-03-2005 11:05

PHP Help!
 
Ok, I'm in the process of creating a php script to upload multiple files, give them a unique id and store them on the server for download via WAP, hit a wall though in that for some reason I can't upload files over 10Kb in size, MAX_UPLOAD in php.ini is set to the default 8M (Scripts on i-web but working on it in uni) Apache timeout is 30s and uploads set to 2M, sorry for the sloppy code (some doesn't need to be there any more) but can anyone spot the problem?

PHP Code:

<?php
include 'config.php'; //load the standard variables


$num_files = count($_FILES['upfile']['name']); //same as above but for no files
if( $num_files < 1 ) 
{
   echo(
"Error! No files to upload... Exiting");  
   exit();
}

  for( 
$idx=0; $idx < $num_files; $idx++ ){ //loops upload code
    
    
$src = $_FILES['upfile']['tmp_name'][$idx]; //grabs array temp file name
    
$ext = strtolower(end(explode(".", $_FILES['upfile']['name'][$idx]))); //converts file name to lower case
    
$filnavn = $_FILES['upfile']['name'][$idx];        
    
$fileid = rand(10000, 99999); //creates a unique ID number for file,   
    //$fileid = substr(microtime() - time() * 2, 12); //another ID Creator method but zeros get clipped off(?) could cause problems. takes current time in millsecs, minus time in seconds to give last 4 millsec no's (take longer that a millsec to upload file and process, so should be unique)
    
$nytNavn = $fileid.".".$ext; //full file name (unique ID plus extension)
    
if(substr($fileid,5)== 0)
        
autom($wapurl,$urltoindex);

   
        
$dst = $_SERVER['DOCUMENT_ROOT']. '/prin/u1r08/wap/uploaded/' . $nytNavn; //set destination directory of file (to be changed to variable link to config.hphp)
    
        
copy($src, $dst);
        
clearstatcache();
        
usleep(500);
        
$fsize = filesize($dst);
        
        if((
$fsize >= $allowedsize) OR $ext=="php" OR $ext=="htm" OR $ext=="html") { //invalid uploads protection.
            
unlink("uploaded/$nytNavn");
            echo(
"<div align=center>File not uploaded, invalid file type.</div>");
        }
        else { 
//upload
            
            
$min = $timeallowed/60; //Time allowed to keep file.
            
$hours = $min/60;
            echo(
"<div align=center>".$_FILES['upfile']['name'][$idx]." upload success! Go to $wapurl using your mobile and enter this number: $fileid<br><br></div>");
            
                
//Insert uploaded file info into database.
    
    
             
$sql = ("INSERT INTO uploads(idnumber,filename,uptime) VALUES('$fileid','$nytNavn','".time()."')");
                
mysql_query($sql, $db);
            
        }
    }
            
        echo(
"<br><a href='$urltoindex/index.php'>Upload a new file</a>");
    
?>

The error that gets thrown is:
Quote:

Warning: filesize(): Stat failed for /var/www/htdocs/prin/u1r08/wap/uploaded/38170.jpg (errno=2 - No such file or directory) in /var/www/htdocs/prin/u1r08/wap/uploadfile.php on line 29
It's like it looping fast that the file is being stored or something?

Bifta 14-03-2005 11:08

Re: PHP Help!
 
what's DOCUMENT_ROOT set to in config.php? (in fact, can you paste that file too?)

Strzelecki 14-03-2005 11:12

Re: PHP Help!
 
DOCUMENT_ROOT is a php reserved variable to automatically fine out the root, but here's config.php anyway:
PHP Code:

<?php

require_once("class.php");


//EDIT HERE START

$dbserver = "bilbo.teach.cs.keele.ac.uk:3306";
$username = "u1r08";
$password = "xxxxxxx";
$database = "wap";
$wapurl = "http://www.teach.cs.keele.ac.uk/prin/u1r08/wap/wap.php";
$urltoindex = "http://www.teach.cs.keele.ac.uk/prin/u1r08/wap";             //path where the script files reside in remember NO trailing slash
$hostpage = "http://www.teach.cs.keele.ac.uk/prin/u1r08/wap/uploaded/"; // directory on server where files are saved remember trailing slash
$timeallowed = 360;         //seconds the file should remain on the server
$allowedsize = 2097152;         //allowed size in bytes


//EDIT HERE END



$db = mysql_connect($dbserver, $username, $password);


mysql_select_db($database,$db);

?>


Bifta 14-03-2005 11:22

Re: PHP Help!
 
Without wanting to state the obvious, it looks like it's either uploading the file into a different path than the one filesize is looking for or it's not uploading it at all, sorry, I can't be anymore help than that, I'm sure Richard M or someone can put you right.

Strzelecki 14-03-2005 11:24

Re: PHP Help!
 
thing is it works fine for file 9.99Kb or less and it is putting them in the right place, why would it change for a file larger than that?

Bifta 14-03-2005 11:32

Re: PHP Help!
 
Quote:

Originally Posted by Strzelecki
thing is it works fine for file 9.99Kb or less and it is putting them in the right place, why would it change for a file larger than that?

If you're on NTL it might (fairly unlikely though) be the HTTP upload failing due to the transparent cache,

Strzelecki 14-03-2005 11:35

Re: PHP Help!
 
Nope, I'm at uni now using their internal system straight to the webserver, does the same thing on NTL though.

Bifta 14-03-2005 11:38

Re: PHP Help!
 
Has it got any other files, (like class.php) I can test it here if you like.

Strzelecki 14-03-2005 11:42

Re: PHP Help!
 
Not really, all it has is config.php, the upload page index.php and the processor uploadfile.php plus a simple table in a MySQL database.
class.php
PHP Code:

<?php

function autom($wapurl, $indexurl){
        
        
$msg = "wapurl: $wapurl\n\n";
        
$msg .="indexurl: $indexurl";
}
?>

plus index.php
PHP Code:

<?php 
include 'config.php';
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>SagemHelp.info WAP uploader</title>
</head>

<body>
<table width="100%"  border="0">
  <tr>
    <td width="18%" height="21">&copy;SagemHelp.info</td>
    <td width="82%">&nbsp;</td>
  </tr>
  <tr>
    <td height="201">&nbsp;</td>
    <td><form enctype="multipart/form-data" action="uploadfile.php" method="POST">
<input name="upfile[]" type="file"><br>
<input name="upfile[]" type="file"><br>
<input name="upfile[]" type="file"><br>
<input type="submit" value="Send Files">
<input type="reset" value="reset">
</form>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
</body>
</html>


Bifta 14-03-2005 11:50

Re: PHP Help!
 
what about require_once("class.php"); in config.php ?

HxBro 14-03-2005 11:55

Re: PHP Help!
 
couple of things, fileid won't be random enough, i use :

$server_filename = md5(microtime() . $_FILES['upfile']['name']) . $extension;

for random filenames

2nd, is the directory /var/www/htdocs/prin/u1r08/wap/uploaded/ actually there and read/writeable by the user the webserver runs as

3rd, try using move_uploaded_file($_FILES['upfile']['tmp_name'][$idx], $dst)

instead of the copy

Strzelecki 14-03-2005 12:03

Re: PHP Help!
 
Quote:

Originally Posted by Strzelecki
class.php
PHP Code:

<?php

function autom($wapurl, $indexurl){
        
        
$msg = "wapurl: $wapurl\n\n";
        
$msg .="indexurl: $indexurl";
}
?>


__________________

Quote:

Originally Posted by HxBro
couple of things, fileid won't be random enough, i use :

$server_filename = md5(microtime() . $_FILES['upfile']['name']) . $extension;

can't do that, has to be a string a 4 numbers, these are entered using a mobile phone via WAP, so using a short string of numbers is easy for the user.

Quote:

Originally Posted by HxBro
2nd, is the directory /var/www/htdocs/prin/u1r08/wap/uploaded/ actually there and read/writeable by the user the webserver runs as

yep, as stated, works fine for smaller files so must be, CHMODed to 777

Quote:

Originally Posted by HxBro
3rd, try using move_uploaded_file($_FILES['upfile']['tmp_name'][$idx], $dst)

instead of the copy

Tried that, does exactly the same thing!:mad: Sorry about this, been driving me mad, probably something simple too!

Richard M 14-03-2005 12:35

Re: PHP Help!
 
Why are you using usleep()?

Strzelecki 14-03-2005 13:11

Re: PHP Help!
 
Oops that slipped in from an earlier effort makes no difference on this loop though.

Richard M 14-03-2005 13:15

Re: PHP Help!
 
If you are able to wait until after 6 I'll post some of my own code which works.

Strzelecki 14-03-2005 13:17

Re: PHP Help!
 
yeah sure, although I will have to credit you so PM me your details if you want. In the mean time if I crack it I'll post back here!

Richard M 14-03-2005 18:46

Re: PHP Help!
 
As promised, this is the code I use for an image upload script - it's highly cut down because I do a helluva lot more with mine such as working out pixel counts etc (demo here: http://www.richardm.co.uk/gallery/?c...on=Screenshots)
Also, I think this code is an older version than what I'm using now but it should work.

HTML, important bits are marked in bold:
Quote:

<form action="./addimage.php" method="post" enctype="multipart/form-data">
<p>Choose file:</p>
<input type="file" name="ImageUploadedFile" /><br />
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
PHP Code:
PHP Code:

// Variables
$ImageDestination = $_POST['ImageDestination'];
$ImageFiletype = $HTTP_POST_FILES['ImageUploadedFile']['type'];
$ImageFilesize = $HTTP_POST_FILES['ImageUploadedFile']['size'];
$ImageUploadedFile = $HTTP_POST_FILES['ImageUploadedFile']['tmp_name'];
$ImageFilename = $HTTP_POST_FILES['ImageUploadedFile']['name'];

// Test Image - nothing allowed apart from jpg, gif and png.
if ($ImageFiletype == 'image/jpeg')
{
$ImageFiletype = 'jpg';
}
elseif (
$ImageFiletype == 'image/gif') {
$ImageFiletype = 'gif';
}
elseif (
$ImageFiletype == 'image/png') {
$ImageFiletype = 'png';
}
else {
echo 
'<html><body><p>The file was not an image!</p></body></html>';
exit;
}

echo 
'<html><body>';

// File handler
if(!is_array ($HTTP_POST_FILES['ImageUploadedFile'])) {
echo 
'<p>A file was not uploaded...<br />';
}
$f =& $HTTP_POST_FILES['ImageUploadedFile']; // saves typing
$dest_dir = "../gallery/" . $ImageDestination;
$dest = $dest_dir . '/'  . $f['name'];
if (!
is_uploaded_file ($f['tmp_name'])) {
echo 
'Error: No file uploaded.<br />';
}
if (!
file_exists ($dest_dir)) {
echo 
"Error: Destination directory $dest_dir does not exist!<br />";
}
if (!
is_dir ($dest_dir)) {
echo 
"Error: Destination directory $dest_dir is not a directory!<br />";
}
if (
file_exists ($dest)) {
echo 
"<html><body>Error: File $dest already exists! I will try to overwrite it...<br />";
}
// all clear, move the file to its permanent location
$r = move_uploaded_file ($f['tmp_name'], $dest);
if (
$r == false)
{ 
// something went wrong
echo "Error: Could not copy file to $dest <br />";
}
else {
echo 
'File uploaded OK...';
}
echo 
'</body></html>'; 

If you want to credit me just link to www.richardm.co.uk - cheers. :)

Strzelecki 14-03-2005 20:40

Re: PHP Help!
 
Ah thanks for the effort, seen lot of these types of script whilst searching the web, not quite what I want but could be adapted, I really want to know why mine doesn't work though and if anything can be done to fix it. I shall fiddle around with your version though and add my ID loop and see how it goes.

iron25 14-03-2005 21:06

Re: PHP Help!
 
I have had a quick look and it looks like the file is not being written fast enough so by the time it gets to line 29 ($fsize = filesize($dst)) the file can not be found. I can only assume that the processing continues immediately after the line copy($src, $dst) and the OS hasn't written the file yet. That would explain why small files work and large files don't. I've never used the usleep() function before but I can guess that it will act as a pause so either increase this and see what happens.

If it is what I suspect then there are several ways around this:

1. put a loop in to check for the existance of the file before continuing, use the file_exists() function.
2. use the system() function to do the copying. It should then wait for OS to finish processing before it continues processing the script.
3. if all you are after is the file size then you should be able to do something like $fsize = $_FILES['upfile']['size'][$idx] to get the size of the current file.

Strzelecki 14-03-2005 22:20

Re: PHP Help!
 
You're all brilliant! $fsize = $_FILES['upfile']['size'][$idx] seems to have fixed it, don't know why I didn't spot it! So thanks to iron25, Richard M and others, greenies for you all!:):)
I was thinking along the same lines as you iron25 so we must've been right, strange that it happens at exactly 10k, on PHP4 and 5 and on different server setups.


All times are GMT. The time now is 11:03.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
All Posts and Content are © Cable Forum