Skip to content
This repository was archived by the owner on May 25, 2023. It is now read-only.

php being downloaded in IE #235

Closed
ricmetal opened this issue May 5, 2011 · 25 comments
Closed

php being downloaded in IE #235

ricmetal opened this issue May 5, 2011 · 25 comments

Comments

@ricmetal
Copy link

ricmetal commented May 5, 2011

hi,
ive installed the example zip file and changed all the ocurrences of application/json to text/plain
but IE still wants to download the php upload file, on upload complete.

is this not a fixed issue?

regards

@sclormu
Copy link

sclormu commented May 6, 2011

current issue :

#212

I've the same problem...

@blueimp
Copy link
Owner

blueimp commented May 6, 2011

I've just updated the provided PHP Upload Handler example with the following changes:

  • Add "no-cache" and "Vary: Accept" headers to the POST response.
  • Vary content-type header based on the Accept header instead of X-Requested-With.

I suspect this issue might have something to do with proxy caching or generally with caching and hopefully, these new settings will fix the IE8 download dialog issue some users experience.

@ricmetal
Copy link
Author

ricmetal commented May 6, 2011

still downloading the file here
im on IE7
the upload hangs, but the file uploads.

@ricmetal
Copy link
Author

udpated to v5,
blueimp, you mention that we should use the Content-Type Negotiation snippet to address this issues.
i am a total newb.
where do i add the snippet?
thanks

@blueimp
Copy link
Owner

blueimp commented May 20, 2011

The example code already includes the Content-type negotiation snippet.
Since this doesn't seem to fix the issue on your server setup I can only conclude this is a server configuration issue.
I can only fix issues that I can reproduce and there is no such problem on the demo page or on my tests with the provided example code on my local Apache+PHP setup.

@sclormu
Copy link

sclormu commented May 20, 2011

I have this problem on my local Apache (wampServer Apache 2.2.11 php 5.3) and on my server, but your demo works perfectly... :(

@ricmetal
Copy link
Author

i am running the plugin on a webhost, so i did not configure it. just fyi.

  1. will running the tests found in the tests folder in the example pack give a clue to why the plugin wont work properly, in the case im having?
  2. and the phpinfo from the server, can that give a clue?
  3. could you help?

thanks

@blueimp
Copy link
Owner

blueimp commented May 21, 2011

To see if the tests run through is always a good idea.
phpinfo is not really that helpful without knowing what to look for.
If your server is publicly accessible I might take a look.

@ricmetal
Copy link
Author

thanks

running the tests in FireFox, occasionally i get two errors:
running the tests in IE, i get a download prompt for the upload php file:

regarding the server being publicly accessible, how do i check if it is accessible?
my website is at:

thanks again

@blueimp
Copy link
Owner

blueimp commented May 22, 2011

DELETE requests are forbidden on your server, so you will have to either fix this or use another HTTP method for file deletion.

However, regarding the original issue, I uploaded files with IE7+IE8 to your server and did not encounter a download dialog. The same result when running all 60 unit tests with those browsers.

So, to conclude:

  • Nobody has the IE-download-dialog issue on the demo page.
  • Some users encounter this issue on their own server setups, e.g. your provided example.
  • I couldn't reproduce this issue with my IE installations, neither on my server-setups nor on yours.

Looks like this issue is a combination of server-configuration + browser-setup or network/proxy issues.
Seems like you get a different response on your IE installation than I did from the same server.

Since I cannot reproduce it, I can't fix it.
I suggest you team up with other users encountering this issue so you might be able to solve it as a group.

@ricmetal
Copy link
Author

thanks
regards

@blueimp blueimp reopened this May 25, 2011
@blueimp
Copy link
Owner

blueimp commented May 25, 2011

I'm reopening so other users with the same issue can find it.

@blueimp
Copy link
Owner

blueimp commented May 26, 2011

@sclormu:
No download dialog issues in my tests with IE8 (Windows XP) on your server.

I still suspect this has something to do with proxy caches. I've committed another update that adds the Pragma:no-cache header to account for HTTP 1.0 proxy caches.

Let me know if this changes anything (though it might take a while until the proxy caches are updated).

@sclormu
Copy link

sclormu commented May 28, 2011

I did the update 2 days ago, nothing has changed.

@ZarToK
Copy link

ZarToK commented May 29, 2011

*EDIT 1: I was a bit to fast in my response, this might not be the solution at all. I'll keep looking for confirmation.

I have found the problem. The EOL type of the document is "UNIX", I changed this to windows/dos and this is possible to do with for example notepad++

For notepad++ go to "Edit" then to "EOL-Conversion", and change it to match the system your server is running on.

I also changed the encoding to UTF-8, but I don't think thats a part of the solution.

Great Regards
ZarToK

@kalmin
Copy link

kalmin commented Jun 2, 2011

it was solved!!!!!!!!!!!!!!!!!!!!!!! change file name upload.php=> upload.html

@kalmin
Copy link

kalmin commented Jun 2, 2011

and your server php-apache can access *.html too ?? it is important!!

@nurkka
Copy link

nurkka commented Jun 3, 2011

@kalmin: you could use mod_rewrite. I changed the filename in the client side script to upload.json and placed a .htacces-File with the following RewriteRule on the server:
RewriteEngine on
RewriteRule ^upload.json$ upload.php [L]

@ACTwebDesigns
Copy link

get(); break; case 'POST': $upload_handler->post(); break; case 'DELETE': $upload_handler->delete(); break; default: header('HTTP/1.0 405 Method Not Allowed'); } ?> options = array( 'script_url' => $_SERVER['PHP_SELF'], 'upload_dir' => dirname(__FILE__).'/files/', 'upload_url' => dirname($_SERVER['PHP_SELF']).'/files/', 'param_name' => 'files', // The php.ini settings upload_max_filesize and post_max_size // take precedence over the following max_file_size setting: 'max_file_size' => null, 'min_file_size' => 1, 'accept_file_types' => '/.+$/i', 'max_number_of_files' => null, 'discard_aborted_uploads' => true, 'image_versions' => array( // Uncomment the following version to restrict the size of // uploaded images. You can also add additional versions with // their own upload directories: /* 'large' => array( 'upload_dir' => dirname(__FILE__).'/files/', 'upload_url' => dirname($_SERVER['PHP_SELF']).'/files/', 'max_width' => 1920, 'max_height' => 1200 ), */ 'thumbnail' => array( 'upload_dir' => dirname(__FILE__).'/thumbnails/', 'upload_url' => dirname($_SERVER['PHP_SELF']).'/thumbnails/', 'max_width' => 80, 'max_height' => 80 ) ) ); if ($options) { $this->options = array_merge_recursive($this->options, $options); } } private function get_file_object($file_name) { $file_path = $this->options['upload_dir'].$file_name; if (is_file($file_path) && $file_name[0] !== '.') { $file = new stdClass(); $file->name = $file_name; $file->size = filesize($file_path); $file->url = $this->options['upload_url'].rawurlencode($file->name); foreach($this->options['image_versions'] as $version => $options) { if (is_file($options['upload_dir'].$file_name)) { $file->{$version.'_url'} = $options['upload_url'] .rawurlencode($file->name); } } $file->delete_url = $this->options['script_url'] .'?file='.rawurlencode($file->name); $file->delete_type = 'DELETE'; return $file; } return null; } private function get_file_objects() { return array_values(array_filter(array_map( array($this, 'get_file_object'), scandir($this->options['upload_dir']) ))); } private function create_scaled_image($file_name, $options) { $file_path = $this->options['upload_dir'].$file_name; $new_file_path = $options['upload_dir'].$file_name; list($img_width, $img_height) = @getimagesize($file_path); if (!$img_width || !$img_height) { return false; } $scale = min( $options['max_width'] / $img_width, $options['max_height'] / $img_height ); if ($scale > 1) { $scale = 1; } $new_width = $img_width * $scale; $new_height = $img_height * $scale; $new_img = @imagecreatetruecolor($new_width, $new_height); switch (strtolower(substr(strrchr($file_name, '.'), 1))) { case 'jpg': case 'jpeg': $src_img = @imagecreatefromjpeg($file_path); $write_image = 'imagejpeg'; break; case 'gif': $src_img = @imagecreatefromgif($file_path); $write_image = 'imagegif'; break; case 'png': $src_img = @imagecreatefrompng($file_path); $write_image = 'imagepng'; break; default: $src_img = $image_method = null; } $success = $src_img && @imagecopyresampled( $new_img, $src_img, 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height ) && $write_image($new_img, $new_file_path); // Free up memory (imagedestroy does not delete files): @imagedestroy($src_img); @imagedestroy($new_img); return $success; } private function has_error($uploaded_file, $file, $error) { if ($error) { return $error; } if (!preg_match($this->options['accept_file_types'], $file->name)) { return 'acceptFileTypes'; } if ($uploaded_file && is_uploaded_file($uploaded_file)) { $file_size = filesize($uploaded_file); } else { $file_size = $_SERVER['CONTENT_LENGTH']; } if ($this->options['max_file_size'] && ( $file_size > $this->options['max_file_size'] || $file->size > $this->options['max_file_size']) ) { return 'maxFileSize'; } if ($this->options['min_file_size'] && $file_size < $this->options['min_file_size']) { return 'minFileSize'; } if (is_int($this->options['max_number_of_files']) && ( count($this->get_file_objects()) >= $this->options['max_number_of_files']) ) { return 'maxNumberOfFiles'; } return $error; } private function handle_file_upload($uploaded_file, $name, $size, $type, $error) { $file = new stdClass(); $file->name = basename(stripslashes($name)); $file->size = intval($size); $file->type = $type; $error = $this->has_error($uploaded_file, $file, $error); if (!$error && $file->name) { if ($file->name[0] === '.') { $file->name = substr($file->name, 1); } $file_path = $this->options['upload_dir'].$file->name; $append_file = is_file($file_path) && $file->size > filesize($file_path); clearstatcache(); if ($uploaded_file && is_uploaded_file($uploaded_file)) { // multipart/formdata uploads (POST method uploads) if ($append_file) { file_put_contents( $file_path, fopen($uploaded_file, 'r'), FILE_APPEND ); } else { move_uploaded_file($uploaded_file, $file_path); } } else { // Non-multipart uploads (PUT method support) file_put_contents( $file_path, fopen('php://input', 'r'), $append_file ? FILE_APPEND : 0 ); } $file_size = filesize($file_path); if ($file_size === $file->size) { $file->url = $this->options['upload_url'].rawurlencode($file->name); foreach($this->options['image_versions'] as $version => $options) { if ($this->create_scaled_image($file->name, $options)) { $file->{$version.'_url'} = $options['upload_url'] .rawurlencode($file->name); } } } else if ($this->options['discard_aborted_uploads']) { unlink($file_path); $file->error = 'abort'; } $file->size = $file_size; $file->delete_url = $this->options['script_url'] .'?file='.rawurlencode($file->name); $file->delete_type = 'DELETE'; } else { $file->error = $error; } return $file; } public function get() { $file_name = isset($_REQUEST['file']) ? basename(stripslashes($_REQUEST['file'])) : null; if ($file_name) { $info = $this->get_file_object($file_name); } else { $info = $this->get_file_objects(); } header("Content-type: application/json"); echo json_encode($info); } public function post() { $upload = isset($_FILES[$this->options['param_name']]) ? $_FILES[$this->options['param_name']] : array( 'tmp_name' => null, 'name' => null, 'size' => null, 'type' => null, 'error' => null ); $info = array(); if (is_array($upload['tmp_name'])) { foreach ($upload['tmp_name'] as $index => $value) { $info[] = $this->handle_file_upload( $upload['tmp_name'][$index], isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index], isset($_SERVER['HTTP_X_FILE_SIZE']) ? $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'][$index], isset($_SERVER['HTTP_X_FILE_TYPE']) ? $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'][$index], $upload['error'][$index] ); } } else { $info[] = $this->handle_file_upload( $upload['tmp_name'], isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'], isset($_SERVER['HTTP_X_FILE_SIZE']) ? $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'], isset($_SERVER['HTTP_X_FILE_TYPE']) ? $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'], $upload['error'] ); } header('Vary: Accept'); if (isset($_SERVER['HTTP_ACCEPT']) && (strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) { header('Content-type: application/json'); } else { header('Content-type: text/plain'); } echo json_encode($info); } public function delete() { $file_name = isset($_REQUEST['file']) ? basename(stripslashes($_REQUEST['file'])) : null; $file_path = $this->options['upload_dir'].$file_name; $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); if ($success) { foreach($this->options['image_versions'] as $version => $options) { $file = $options['upload_dir'].$file_name; if (is_file($file)) { unlink($file); } } } header('Content-type: text/plain'); echo json_encode($success); exit; } ``` } ?>

@ACTwebDesigns
Copy link

This will sort the file download for IE

@jackinurbox
Copy link

@ACTwebDesigns
Thank you so much for taking the time to not only investigate but find a solution to this issue! I changed the code for upload.php and created upload_class.php accordingly, and the IE download popup no longer apears. You rock!

@ACTwebDesigns
Copy link

No worries, I needed this to work as it's the best I've come across but I need things to work in every browser. Thumbs up to blueimp for a crackin piece of code.

@blueimp
Copy link
Owner

blueimp commented Jun 10, 2011

Thanks, ACTwebDesigns.
Could you explain what made the difference in your code?
I suspect it's this line:

header("Content-Disposition: inline; filename=\"upload.json\"");

As I stated above I could never reproduce the issues users had with the download dialog, but if someone can confirm that adding this line to the current source fixes the problem, I'll add it to the repository.

@ACTwebDesigns
Copy link

It is yes, to tell IE to read this "attachment" inline. I have also added ob_clean in there to rule out any output for IE to trip over it's shoelaces with...

@sclormu
Copy link

sclormu commented Jun 14, 2011

thank you very much :)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants