-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
php being downloaded in IE #235
Comments
current issue : I've the same problem... |
I've just updated the provided PHP Upload Handler example with the following changes:
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. |
still downloading the file here |
udpated to v5, |
The example code already includes the Content-type negotiation snippet. |
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... :( |
i am running the plugin on a webhost, so i did not configure it. just fyi.
thanks |
To see if the tests run through is always a good idea. |
thanks running the tests in FireFox, occasionally i get two errors: regarding the server being publicly accessible, how do i check if it is accessible? thanks again |
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:
Looks like this issue is a combination of server-configuration + browser-setup or network/proxy issues. Since I cannot reproduce it, I can't fix it. |
thanks |
I'm reopening so other users with the same issue can find it. |
@sclormu: 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). |
I did the update 2 days ago, nothing has changed. |
*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 |
it was solved!!!!!!!!!!!!!!!!!!!!!!! change file name upload.php=> upload.html |
and your server php-apache can access *.html too ?? it is important!! |
@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: |
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; } ``` } ?> |
This will sort the file download for IE |
@ACTwebDesigns |
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. |
Thanks, ACTwebDesigns.
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. |
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... |
thank you very much :) |
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
The text was updated successfully, but these errors were encountered: