PHP: Cannot upload ZIP Files - php

Whenever I try to upload a ZIP File via PHP, the Filesize is 0.
Everything else works: 7z, rar, png, xml
for example (I output filesize and location for testing):
File Location: /tmp/phpKNortG/feba81fed1ff5d2c04aa0c42975eb94f.7z
Filesize: 1284
File Location: /tmp/phpEWrmLT/feba81fed1ff5d2c04aa0c42975eb94f.zip
Filesize: 0
My form has enctype="multipart/form-data" and the file is definitely not too big to be uploaded. (I've also set the memory limit to 128 MB to make sure it's not that)
ini_set('memory_limit', '128M');
set_time_limit(0);
$session_id = "3423840093480344";
mkdir('uploaded_files/' . $session_id);
for($i = 0; $i < count($_FILES['backup_file']['name']); $i++) {
$file_name = $_FILES['backup_file']['name'][$i];
$file_type = $_FILES['backup_file']['type'][$i];
$file_error = $_FILES['backup_file']['error'][$i];
$file_size = $_FILES['backup_file']['size'][$i];
$file_tmp = $_FILES['backup_file']['tmp_name'][$i];
print($file_name . "<br />");
print($file_type . "<br />");
print($file_error . "<br />");
print($file_size . "<br />");
print($file_tmp . "<br />");
if($file_error != 0) {
echo "Error-Code: ".$file_error;
continue;
}
move_uploaded_file($file_tmp, 'uploaded_files/' . $session_id);
}
The following code outputs this:
feba81fed1ff5d2c04aa0c42975eb94f.zip
application/zip
0
0
/tmp/phpEWrmLT
It even recognizes the MIME-Type, but the file is always zero bytes in size. (even before moving it with move_uploaded_file)
Is there any server setting that could prevent .zip files to be uploaded?

The memory_limit setting has no bearing on file uploads.
What are the values for your post_max_size and upload_max_filesize and how does the .zip filesize compare with those values?

Related

how to get a hidden file size in php

I am uploading image files in PHP but I found out that I was unable to get a file size of some images captured from one mobile device. I can get the file name but not the size so can anyone tell what likely will be the problem or how to fix it to be able to get the file size?
When I check the size in my system its size is in MB while other of my images are in KB.
<?php
if (isset($_FILES["file"]["name"][1]) && !empty($_FILES["file"]["name"])) {
$fileext = ["jpg", "jpeg", "png", "bif", "gif", "bmp"];
for ($i = 1; $i < count($_FILES["file"]["name"]); $i++) {
$name = $_FILES["file"]["name"][$i];
$type = $_FILES["file"]["type"][$i];
$size = $_FILES["file"]["size"][$i];
$path = $_FILES["file"]["tmp_name"][$i];
$ext = end(explode('.', strtolower($name)));
//checking file supported type
if (in_array($ext, $fileext)) {
echo $name . "<br>";
} else {
echo "file type not supported!";
}
}
}
?>
As for the file upload error:
You need to set the value of upload_max_filesize and post_max_size in your php.ini :
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
After modifying php.ini file(s), you need to restart your HTTP server to use new configuration.
if you'r unable to access your php.ini you can try:
ini_set('upload_max_filesize', '10M');
ini_set('post_max_size', '10M');
ini_set('max_input_time', 300);
ini_set('max_execution_time', 300);
also incressing memory_limit might be usefull..

Print/debug cause of upload error in PHP

I'm a PHP newbie and have written a script to process form uploads. It works for small files(less than 1Mb). However when I try to upload an ~4Mb pdf file it returns an error message. What am I doing wrong?
PS: I ran php_info, got the value of "upload_tmp_dir" and set it to a directory owned by the apache process(www-data)
My client-side code is
<form action="upper.php" method="post" enctype="multipart/form-data">
<input type="file" name="myFile"><br>
<input type="submit" value="Upload">
</form>
Upper.php contains
define("UPLOAD_DIR", "/var/www/html/upload/");
if (!empty($_FILES["myFile"])) {
$myFile = $_FILES["myFile"];
if ($myFile["error"] !== UPLOAD_ERR_OK) {
echo "Error is " . $myFile["error"];
//echo "<p>An error occurred.</p>";
exit;
}
$name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]);
// don't overwrite an existing file
$i = 0;
$parts = pathinfo($name);
while (file_exists(UPLOAD_DIR . $name)) {
$i++;
$name = $parts["filename"] . "-" . $i . "." . $parts["extension"];
}
// preserve file from temporary directory
$success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name);
if (!$success) {
echo "<p>Unable to save file.</p>";
exit;
}
// set proper permissions on the new file
chmod(UPLOAD_DIR . $name, 0644);
}
Most probably you have wrong config in you php.ini file.
You need to set
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
its already described here: PHP change the maximum upload file size
You ned to set values in php.in file.
Open the file,
Find upload_max_filesize and post_max_size lines.
Change this two value. (M= MB)
; Maximum allowed size for uploaded files.
upload_max_filesize = 20M
; Must be greater than or equal to upload_max_filesize
post_max_size = 20M
Restart the sever for effect.
Note:
You can set any number. But not use any decimal value.
Open the php.ini file in NOTEPAD. Don't user wordpad or any word processor.

php upload file and move to server

I want to upload files from my server. I had written this piece of code months ago when it worked fine, but now I have no idea what's going wrong.
I basically want to move the file to a folder "uploads" in my server and then store the path in the database.
The uploaded file doesn't get reflected in the database.
if(isset($_POST['submit']))
{
require("dbconn.php");
$filename = $_POST['filename'];
$name = $filename . "." . pathinfo($_FILES['ufile']['name'],PATHINFO_EXTENSION);
//$name = $_FILES['ufile']['name'];
//$size = $_FILES['file']['size']
//$type = $_FILES['file']['type']
$tmp_name = $_FILES['ufile']['name']; //was tmp_name
$error = $_FILES['ufile']['error'];
if(isset($name))
{
if(!empty($name))
{
$location = 'uploads/';
if(move_uploaded_file($tmp_name, $location.$name))
{
echo "hi";
$filename = $_POST['filename'];
$filepath = $location.$name;
$advname = $_POST['advname'];
$year = $_POST['year'];
$cname = $_POST['cname'];
$ctype = $_POST['ctype'];
$sqlq = "INSERT INTO file(filename, filepath, advname, year, cname, ctype) VALUES ('".$filename."','".$filepath."','".$advname."','".$year."','".$cname."','".$ctype."');";
$result = mysql_query($sqlq);
if(!$result)
{
die("Error in connecting to database!");
}
}
}
}
}
There seems to be a problem in the
if(move_uploaded_file($tmp_name, $location.$name))
statement. This condition is evaluated as false.
If $_FILES['ufile']['error'] gives you a value of 1 then the upload_max_filesize in your config is set to a smaller value that the file you are trying to upload.
You cannot change the upload_max_filesize from within your code.
If you have access to your php.ini, .htaccess, httpd.conf or .user.ini you can change this value in any of those files.
So you would need to add or modify the parameter from its default of 2M (2meg)
upload_max_filesize = 20M
Its also a good idea to check the post_max_size at the same time as this may also have an effect on the max size of the file uploaded, make sure post_max_size is larger than upload_max_filesize as this should allow extra space for the other fields that you will be uploading as part of the post

How To Import Large Excel File To MySql Database Using PHP

I have to upload excel file's data to MySQL database using php. I have found the code for that but I am unable to upload large files.
Can anyone please tell me that how can I increase the max file size limit for the code mentioned in below link:
http://www.9code.in/how-to-import-excel-file-to-mysql-database-using-php/
<!DOCTYPE html>
<?php
include 'db.php';
include 'Excel/reader.php';
function uploadFile($fieldName, $fileType, $folderName, $name = "")
{
$flg = 0;
$MaxID = "";
$ext = "";
$uploadfile = "";
if (isset($fieldName) AND $fieldName['name'] != '')
{
$flg = 1;
$allowed_filetypes = $fileType;
// I Need to increase this..... I tried changing values but nothing happened
$max_filesize = 1048576;
$filename = $fieldName['name'];
if ($name == "")
$MaxID = time() . time() . rand(1, 100);
else
$MaxID = $name;
$ext = substr($filename, strpos($filename, '.'), strlen($filename) - 1);
if($ext==".xlsx")
$ext=".xls";
if (!in_array($ext, $allowed_filetypes))
echo "<h1>The file you attempted to upload is not allowed...</h1>";
else if (filesize($fieldName['tmp_name']) > $max_filesize)
echo "<h1>The file you attempted to upload is too large...</h1>";
else
{
$uploadfile = $folderName . "/" . $MaxID . $ext;
if (move_uploaded_file($fieldName['tmp_name'], $uploadfile) == FALSE)
{
echo "<h1>Error in Uploading File...</h1>";
$MaxID = "";
}
else
$MaxID = $MaxID . $ext;
}
}
return $MaxID;
}
if(isset($_POST['submit']))
{
if($_FILES['csvFile']['name']!="")
{
$fileName=uploadFile($_FILES['excelFile'],array(".csv"),"excel_file");
$row=0;
if(($handle = fopen("excel/".$fileName , "r")) !== FALSE)
{
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
{
$num = count($data);
//print_r($data);
$query="INSERT INTO StudentData(FirstName,LastName,MobileNo,City)VALUES('".$data[0]."','".$data[1]."','".$data[2]."','".$data[3]."')";
mysql_query($query);
}
fclose($handle);
}
}
else if($_FILES['excelFile']['name']!="")
{
$fileName=uploadFile($_FILES['excelFile'],array(".xls",".xlsx"),"excel_file");
$data = new Spreadsheet_Excel_Reader();
$data->read('excel_file/'.$fileName);
for($i=1;$i<=$data->sheets[0]['numRows'];$i++)
{
$firstname=$data->sheets[0]['cells'][$i][1];
$lastname=$data->sheets[0]['cells'][$i][2];
$mobile=$data->sheets[0]['cells'][$i][3];
$city=$data->sheets[0]['cells'][$i][4];
$query="INSERT INTO StudentData(FirstName,LastName,MobileNo,City)VALUES('".$firstname."','".$lastname."','".$mobile."','".$city."')";
mysql_query($query);
}
}
}
if(isset($_POST['delete']))
{
mysql_query("DELETE FROM StudentData");
}
?>
You can use LOAD DATA command in MySQL : Read More
you have to used load data in mysql statement. This can load your large file in database.
mysqli_query($dblink, '
LOAD DATA LOCAL INFILE "'.$file.'"
INTO TABLE transactions
FIELDS TERMINATED by ","
OPTIONALLY ENCLOSED BY "\'"
LINES TERMINATED BY "\n"
');
Look at these values in your php.ini
upload_max_filesize = 10M
post_max_size = 10M
You need to set the value of upload_max_filesize and post_max_size in your php.ini :
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
I have to add that you have to restart the server
According to ASNAOUI Ayoub I made the following changes:
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
But Stil the Problem was same then I tried to change the
$max_filesize = 41943040
Now It perfectly works.....
Thanks Everyone for the help

Slow Upload in PHP joomla controler

here is the code that i use to upload files and unzip them in a directory.
But the problem is that it seems to be very slow on files greater than 5MB.
I think it doesnt have to do with the network because it is in localhost computer.
Do I need to edit any parameter in php.ini file or apache or any other workarround?
$target_path = "../somepath/";
$target_path .= JRequest::getVar('uploadedDirectory')."/";
$target_Main_path= JRequest::getVar('uploadedDirectory')."/";
$folderName = $_FILES['uploadedfile']['name'];
$target_path = $target_path . basename($folderName);
//upload file
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path."/")) {
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
$zip = new ZipArchive;
$res = $zip->open($target_path);
$target_path = str_replace(".zip", "", $target_path);
echo $target_path;
if ($res === TRUE) {
$zip->extractTo($target_path."/");
$zip->close();
echo "ok";
} else {
echo "failed";
}
When handling file uploads ther are a lot of factors to consider. These include PHP settings:
max_input_time
max_execution_time
upload_max_filesize
post_max_size
Execution time can affect the upload if for example, you have a slow upload speed resulting in a timeout.
File size can cause problems if the upload is larger than the upload_max_filesize like wise if your file size + the rest of the post data exceeds post_max_size.
Zip uses a lot of memory in the archive/extraction processes and could easily exceed the memory allocated to PHP -so that would be worth checking as well.
I would start with this page and note some of the comments.

Categories