Upload picture

  • Thread starter Thread starter Anonymous
  • Start date Start date
A

Anonymous

Guest
I try to upload a picture & store the info about the picture
I faced some problem here, hope that u all can help me.....
the error message is "Can't open file!"
any codes need the be improved?
thanx...

If i use this code, i just can upload the file to the folder, not the info to the database....
Code:
<?php
$uploaddir = './image/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];

print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
   print "File is valid, and was successfully uploaded. ";
   print "Here's some more debugging info:\n";
   print_r($_FILES);
} else {
   print "Possible file upload attack!  Here's some debugging info:\n";
   print_r($_FILES);
}
print "</pre>";
?>


upload.php
Code:
<body bgcolor="#FFFFFF" text="#000000">
<form enctype="multipart/form-data" action="test.php" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="50000" />
 Send this file: <input name="userfile" type="file" />
 <input type="submit" value="Send File" />
</form>

test.php
Code:
<?php
include "./common.inc";
// Max packet size
   define("MAX_SQL",50000);
   $filehandle = fopen($tmp, "rb") or die( "Can't open file!" ); 
   $query=    "INSERT INTO files (name, type, size) VALUES(".
             $DB->quote($name).", ".
             $DB->quote($type).", ".
             $DB->quote($size).
             ")";

   // Execute Query
   $result = $DB->query($query);
   $file_id = mysql_insert_id();

// Copy the binary file data to the filedata table in sequential rows each containing MAX_SQL bytes
// Your table should have an index set to auto_increment
// Store the file_id to identify the data fragments
   while (!feof ($filehandle)) { 
       $data = base64_encode(fread($filehandle,MAX_SQL)); 
       $query = "INSERT INTO filedata (file_id, data) VALUES($file_id,\"".$data."\")";
       $result = $DB->query($query); 
   }
   fclose ($filehandle); 
?>

Decode the data fragments and recombine them:
<?php
   $file_id =$_GET ['file_id']; 
   $query ="select file_id, name, type, size from files where file_id='$file_id'";
   $result = $DB->query($query);
   $row= mysql_fetch_array ($result); 
   $type = $row ["type"]; 
   $name = $row ["name"]; 
   $size = $row ["size"]; 
   $file_id = $row ["file_id"]; 

   // get the file data
   $query = "select id, data from filedata where file_id='$file_id' ORDER by id";
   $result = $DB->query($query);

// decode the fragments and recombine the file
   $data = "";
   while ($row = mysql_fetch_array($result)) {
       $data .= base64_decode($row ["data"]);  
   }
   
// output the file
   header ("Content-type: $type"); 
   header ("Content-length: $size"); 
   header ("Content-Disposition: attachment; filename=$name"); 
   header ("Content-Description: PHP Generated Data"); 
   echo $data;
?>

common.inc
Code:
<?php
$dbhost = "localhost";
$dbusername = "root";
$dbuserpassword = "";
$default_dbname ="upload";

$MYSQL_ERRNO = '';
$MYSQL_ERROR = '';
function db_connect() {
global $dbhost, $dbusername, $dbuserpassword, $default_dbname;
global $MYSQL_ERRNO, $MYSQL_ERROR;
$link_id = mysql_connect($dbhost, $dbusername, $dbuserpassword);
if(!$link_id) {
$MYSQL_ERRNO = 0;
$MYSQL_ERROR = "Connection failed to the host $dbhost.";
return 0;
}
else if(empty($dbname) && !mysql_select_db($default_dbname)) {
$MYSQL_ERRNO = mysql_errno();
$MYSQL_ERROR = mysql_error();
return 0;
}
else return $link_id;
}
function sql_error() {
global $MYSQL_ERRNO, $MYSQL_ERROR;
if(empty($MYSQL_ERROR)) {
$MYSQL_ERRNO = mysql_errno();
$MYSQL_ERROR = mysql_error();
}
return "$MYSQL_ERRNO: $MYSQL_ERROR";
}
?>


database table

create table files(
name varchar(50),
type varchar(30),
size varchar(30));

create table filedata(
file_id int auto_increment primary key,
data varchar(30));
 
This line's causing you the error:
Code:
<?php
$filehandle = fopen($tmp, "rb") or die( "Can't open file!" );
?>
Where do you get the vaiable $tmp from?
 
oops!! :shock:
i just start learning PHP, this code is from php.net....
can u correct it for me?
thanks... :(
 
i want to check the file whether is a picture format..
but i faced some problem...
thanx...

Warning: Wrong parameter count for move_uploaded_file() in c:\phpweb\uploading.php on line 14

Code:
<?php
include "./common.inc";
$conn = db_connect('$db');

$uploaddir = './image/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];

print "<pre>";
$image_types = Array ("image/bmp",
                        "image/jpeg",
                        "image/pjpeg",
                        "image/gif",
                        "image/x-png");
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile, $image_types)) {

  $name = $_FILES["userfile"]["name"];
  $size = $_FILES["userfile"]["size"];
  $type = $_FILES["userfile"]["type"];
	
	$result=mysql_query("insert into pic (image_id, image_name, image_type, image_size) values ('','$name','$type','$size')");

   	print "File is valid, and was successfully uploaded. ";
   	print "Here's some more debugging info:\n";
   	print_r($_FILES);

} else {
echo"Invalid picture format or file larger than 100kb.<br/>";
   print "Possible file upload attack!  Here's some debugging info:\n";
   print_r($_FILES);
}
print "</pre>";

?>
 
Back
Top