When I upload a file in PHP I am getting the wrong type for xlsx files.
It is telling me the type is a file name
Array (
[name] => report.xlsx
[type] => /folder/files/report/april_2013.xlsx
[tmp_name] => E:\path\to\temp\folder\phpCD1B.tmp
[error] => 0
[size] => 12433
)
Any ideas?
Hi
The code I am using is
view/display file
<form enctype="multipart/form-data" method="POST" action="update_comp.php" name="myform2">
<label>Upload Files ( PDF,CSV or EXCEL only ) </label>
<input type="file" name="file">
</form>
File update_comp.php
include ("filesFunctions.php");
if(isset($_FILES["file"])){
$file = $_FILES["file"];
print_r($file);exit;
$upload = new filesFunctions();
$id = $upload->uploadFiles($file,'dairy');
}
the print_r() statement prints
Array (
[name] => report.xlsx
[type] => /folder/files/report/april_2013.xlsx
[tmp_name] => E:\folder\to\temp\php5ACD.tmp
[error] => 0
[size] => 12433
)
Please note this only happens to xlsx files all other files work fine
The type key provides the MIME type of the file but this information is provided by the browser. As such:
This mime type is however not checked on the PHP side and therefore
don't take its value for granted.
However, it's worth nothing that the $_FILES superglobal is by no means read-only. Like other superglobals, your PHP code can overwrite it:
$_FILES['file']['type'] = 'Lorem ipsum dolor sit amet';
Assuming that you aren't fiddling with $_FILES, the first obvious troubleshooting step is to fire your browser's debugger tools and inspect the POST data it sends. If that's the source of the string, you can forget about PHP.
I don't know what your browser is. In Google Chrome (in other browsers similar instructions apply) you must open the upload form, hit F12 and then click on "Network":
When you pick a file and submit the form, you'll see the request:
Expand the node and you'll see the data (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet in this case):
This MIME type is normally configured by the Microsoft Office installer. If yours contains /folder/files/report/april_2013.xlsx you might need to repair or reinstall.
Just totally wrong file? Name: report.xlsx
And after that youn say april_2013.xlsx like #h2ooooooo said.
I think you just copied the code from another file.
Related
So I have a form on a page that uses enctype="multipart/form-data", and I have a single file field on the form named 'upload_file'. When I submit the form and use print_r($_FILES), I get:
Array
(
[upload_file] => Array
(
[name] => Test-Blank-PDF.pdf
[type] => application/pdf
[tmp_name] => /tmp/phpvr5N3Z
[error] => 0
[size] => 0
)
You will notice both the error and size are 0. I use the following code to process the upload:
$file = "/tmp/" . $_FILES['upload_file']['name'];
if ($_FILES['upload_file']['error'] === UPLOAD_ERR_OK) {
move_uploaded_file($_FILES['upload_file']['tmp_name'], $file);
}
I get the file ($file) created at /tmp/Test-Blank-PDF.pdf, but it is 0 bytes (empty). If I also try to save/read the value of $_FILES['upload_file']['tmp_name'] with file_get_contents before script completion, it is also empty.
This is running on CentOS 6 with PHP 5.6. Other forms upload and process files fine, although they run via AJAX, but all still use $_FILES in the back-end to save. This is the only one that doesn't.
I have verified various PHP settings (file_uploads are on and post_max_size and such are all set properly). My form is using POST, and the $_FILES array does print data (e.g. not empty). I checked Apache's error logs (both SSL and plain) and no errors in either. I even turned off iptables to test, and it still failed.
Any ideas? I'm at a loss here. : /
I'm working on someone else's page that has a simple form with a file upload. When I do a:
print_r($_FILES);
after the form submission I get the following:
Array
(
[input_41] => Array
(
[name] => Resources.pdf
[type] => application/pdf
[tmp_name] => /tmp/phpvVUox1
[error] => 0
[size] => 14563
)
)
I now need to get the name of the uploaded file - I'm familiar with the POST syntax of retrieving form field input values such as:
$_POST['input_32']
but not sure how to get the file name within an array.
As you can see in your print_r() output, you already have name property of the file in it, You can use this to get the name of the file.
$_FILES["input_41"]["name"]
Reference: http://php.net/manual/en/reserved.variables.files.php
I want to get the full path of image in PHP. I used <input> tag for image uploading. I'm unable to get the full path. when I alert the value of <input type="file">, I'm getting
c:/fake-path/image.jpg
Here is my code:
<input type="file" name="upload_captcha_background" id="upload_captcha_background" />
var file_path= jQuery("#upload_captcha_background").val();
alert(file_path);
and in PHP I'm fetching the value like:
$ux_image_path =$_FILES['upload_captcha_background'];
If you mean the path where the image was located on the user computer before he/she uploaded it to your form - you can never know it in php or javascript or anywhere else.
In PHP you can see the path on SERVER (usually in the temporary folder) where the file was stored so you can read or copy it. If may just happen that the server is as well your user computer (i.e. you are testing the website on http :// localhost) but don't confuse those two things.
You can never be sure of getting a full filepath or even a reliable filename or content-type submitted in a file upload file.
you should never do so....and i think trying it in latest browsers is useless(from what i know) .. all latest browsers on the other hand , will not allow this.
Some related Stackoverflow questions:
How to get the full path of the file from a file input
Full path from file input using jQuery
Retrieving the full path (server-side) of a file uploaded using Firefox
the structure for
$_FILES[]
as follows
/*
Array
(
[image] => Array
(
[name] => Array
(
[0] => 400.png
)
[type] => Array
(
[0] => image/png
)
[tmp_name] => Array
(
[0] => /tmp/php5Wx0aJ
)
[error] => Array
(
[0] => 0
)
[size] => Array
(
[0] => 15726
)
)
)
*/
if you are trying to upload a file and copy it to a directory
use the following code
$tmp_name = $_FILES['upload_captcha_background']["tmp_name"];
$name = $_FILES['upload_captcha_background']['name'];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
I'm trying to upload a zip file and a csv file from HTML form.
On PHP, When I printed $_FILES (Actually $request->getFiles() in symfony), I got following.
Array
(
[zipfile] => Array
(
[name] => tempfiles.zip
[type] => application/octet-stream
[tmp_name] => C:\wamp\tmp\php5D42.tmp
[error] => 0
[size] => 850953
)
[csvfile] => Array
(
[name] => test.csv
[type] => application/vnd.ms-excel
[tmp_name] => C:\wamp\tmp\php5D52.tmp
[error] => 0
[size] => 312
)
)
I'm wondering with the type and tmp_name. I need to take few decisions based on type. Is it safe to take decisions on existing type? Will I get same result for similar files on Linux server?
Again tmp_name have .tmp extension. Is it consistent on both windows/linux? If not, is there any way that the code I write on windows (decision using type) will work on linux without any issue?
Using this type can be dangerous Because user can change the type of the files and can upload a php script.
You should validate the type first just like get_image_size() to validate a image file.I have no idea about .zip file
It is not safe to trust the type form $_FILES, you need to validate the file type in server side.
For .tmp extension, it is ok both on windows or linux.
can anyone shed some light on this:
Array
(
[video] => Array
(
[name] => 20051210-w50s.flv
[type] =>
[tmp_name] => /tmp/php38JFea
[error] => 0
[size] => 669036
)
)
I'm uploading an flv file, but the [type] is not being filled, is this common?
cheers in advance!
The type field is a MIME type set by the client. In this case, it just didn't know what a flv file is, and didn't set it. It is a good thing not to rely on this information, as it can be freely altered by an attacker.
If you want to get reliable info about an uploaded video file, you need to do a server-side check. The getid3 for example seems to be able to recognize flv files.
The built-in getimagesize() function can do the same for many image formats.