]> git.mxchange.org Git - friendica.git/blobdiff - addon/js_upload/js_upload.php
Merge branch 'master' of git://github.com/friendika/friendika
[friendica.git] / addon / js_upload / js_upload.php
index 143f9ba337164051ea95f3fc51dfa145eb6873f4..331548f8803258d2a221397a2be7165a754d0838 100644 (file)
 <?php
 
+/**
+ * Name: JS Uploader
+ * Description: JavaScript photo/image uploader. Uses Valum 'qq' Uploader.
+ * Version: 1.0
+ * Author: Chris Case <http://friendika.openmindspace.org/profile/chris_case>
+ */
+
+/**
+ *
+ * JavaScript Photo/Image Uploader
+ *
+ * Uses Valum 'qq' Uploader. 
+ * Module Author: Chris Case
+ *
+ */
+
 
 function js_upload_install() {
-       register_hooks('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
-       register_hooks('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
-       register_hooks('photo_post_end',  'addon/js_upload/js_upload.php', 'js_upload_post_end');
+       register_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+       register_hook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
+       register_hook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
+       register_hook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
 }
 
 
 function js_upload_uninstall() {
-       register_hooks('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
-       register_hooks('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
-       register_hooks('photo_post_end',  'addon/js_upload/js_upload.php', 'js_upload_post_end');
+       unregister_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+       unregister_hook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
+       unregister_hook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
+       unregister_hook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
 }
 
 
+function js_upload_form(&$a,&$b) {
+
+       $b['default_upload'] = false;
+
+       $b['addon_text'] .= '<link href="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.css" rel="stylesheet" type="text/css">';
+       $b['addon_text'] .= '<script src="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.js" type="text/javascript"></script>';
+   
+       $upload_msg = t('Upload a file');
+       $drop_msg = t('Drop files here to upload');
+       $cancel = t('Cancel');
+       $failed = t('Failed');
+
+       $b['addon_text'] .= <<< EOT
+       
+ <div id="file-uploader-demo1">                
+  <noscript>                   
+   <p>Please enable JavaScript to use file uploader.</p>
+   <!-- or put a simple form for upload here -->
+  </noscript> 
+ </div>
+
+<script type="text/javascript">
+var uploader = null;       
+function getSelected(opt) {
+            var selected = new Array();
+            var index = 0;
+            for (var intLoop = 0; intLoop < opt.length; intLoop++) {
+               if ((opt[intLoop].selected) ||
+                   (opt[intLoop].checked)) {
+                  index = selected.length;
+                  //selected[index] = new Object;
+                  selected[index] = opt[intLoop].value;
+                  //selected[index] = intLoop;
+               }
+            }
+            return selected;
+         } 
+function createUploader() {
+       uploader = new qq.FileUploader({
+               element: document.getElementById('file-uploader-demo1'),
+               action: '{$b['post_url']}',
+
+        template: '<div class="qq-uploader">' + 
+                '<div class="qq-upload-drop-area"><span>$drop_msg</span></div>' +
+                '<div class="qq-upload-button">$upload_msg</div>' +
+                '<ul class="qq-upload-list"></ul>' + 
+             '</div>',
+
+        // template for one item in file list
+        fileTemplate: '<li>' +
+                '<span class="qq-upload-file"></span>' +
+                '<span class="qq-upload-spinner"></span>' +
+                '<span class="qq-upload-size"></span>' +
+                '<a class="qq-upload-cancel" href="#">$cancel</a>' +
+                '<span class="qq-upload-failed-text">$failed</span>' +
+            '</li>',        
+
+               debug: true,
+               onSubmit: function(id,filename) {
+                       if (typeof acl!="undefined"){
+                               uploader.setParams( {
+                                       newalbum                :       document.getElementById('photos-upload-newalbum').value,
+                                       album                   :       document.getElementById('photos-upload-album-select').value,
+                                       group_allow             :       acl.allow_gid.join(','),
+                                       contact_allow   :       acl.allow_cid.join(','),
+                                       group_deny              :       acl.deny_gid.join(','),
+                                       contact_deny    :       acl.deny_cid.join(',')
+                               });
+                       } else {
+                               uploader.setParams( {
+                                       newalbum                :       document.getElementById('photos-upload-newalbum').value,
+                                       album                   :       document.getElementById('photos-upload-album-select').value,
+                                       group_allow             :       getSelected(document.getElementById('group_allow')).join(','),
+                                       contact_allow   :       getSelected(document.getElementById('contact_allow')).join(','),
+                                       group_deny              :       getSelected(document.getElementById('group_deny')).join(','),
+                                       contact_deny    :       getSelected(document.getElementById('contact_deny')).join(',')
+                               });
+                       }
+               }
+       });           
+}
+
+
+// in your app create uploader as soon as the DOM is ready
+// don't wait for the window to load  
+window.onload = createUploader;     
+
+
+</script>
+EOT;
+
+
+}
+
 function js_upload_post_init(&$a,&$b) {
 
        // list of valid extensions, ex. array("jpeg", "xml", "bmp")
@@ -23,35 +136,42 @@ function js_upload_post_init(&$a,&$b) {
 
        // max file size in bytes
 
-       $sizeLimit = 6 * 1024 * 1024;
+       $sizeLimit = get_config('system','maximagesize'); //6 * 1024 * 1024;
 
        $uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
-       $result = $uploader->handleUpload('uploads/');
+
+       $result = $uploader->handleUpload();
+
 
        // to pass data through iframe you will need to encode all html tags
        $a->data['upload_jsonresponse'] =  htmlspecialchars(json_encode($result), ENT_NOQUOTES);
 
        if(isset($result['error'])) {
                logger('mod/photos.php: photos_post(): error uploading photo: ' . $result['error'] , 'LOGGER_DEBUG');
+               echo json_encode($result);
                killme();
        }
 
+       $a->data['upload_result'] = $result;
 
 }
 
-function js_upload_photo_post_file(&$a,&$b) {
+function js_upload_post_file(&$a,&$b) {
 
-       $b['src']               = 'uploads/'.$result['filename'];
+       $result = $a->data['upload_result'];
+
+       $b['src']               = $result['path'];
        $b['filename']  = $result['filename'];
-       $b['filesize']  = filesize($src);
+       $b['filesize']  = filesize($b['src']);
+
 }
 
 
-function js_upload_photo_post_end(&$a,&$b) {
+function js_upload_post_end(&$a,&$b) {
 
+logger('upload_post_end');
        if(x($a->data,'upload_jsonresponse')) {
                echo $a->data['upload_jsonresponse'];
-               @unlink($src);
                killme();
        }
 
@@ -62,30 +182,36 @@ function js_upload_photo_post_end(&$a,&$b) {
  * Handle file uploads via XMLHttpRequest
  */
 class qqUploadedFileXhr {
+
+       private $pathnm = '';
+
     /**
-     * Save the file to the specified path
+     * Save the file in the temp dir.
      * @return boolean TRUE on success
      */
-    function save($path) {    
+    function save() {    
         $input = fopen("php://input", "r");
-        $temp = tmpfile();
+        $this->pathnm = tempnam(sys_get_temp_dir(),'frn');
+               $temp = fopen($this->pathnm,"w");
         $realSize = stream_copy_to_stream($input, $temp);
+
         fclose($input);
+               fclose($temp);
         
         if ($realSize != $this->getSize()){            
             return false;
         }
-        
-        $target = fopen($path, "w");        
-        fseek($temp, 0, SEEK_SET);
-        stream_copy_to_stream($temp, $target);
-        fclose($target);
-        
         return true;
     }
+
+       function getPath() {
+               return $this->pathnm;
+       }
+
     function getName() {
         return $_GET['qqfile'];
     }
+
     function getSize() {
         if (isset($_SERVER["CONTENT_LENGTH"])){
             return (int)$_SERVER["CONTENT_LENGTH"];            
@@ -98,17 +224,24 @@ class qqUploadedFileXhr {
 /**
  * Handle file uploads via regular form post (uses the $_FILES array)
  */
+
 class qqUploadedFileForm {  
+
+
     /**
      * Save the file to the specified path
      * @return boolean TRUE on success
      */
-    function save($path) {
-        if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
-            return false;
-        }
+
+
+    function save() {
         return true;
     }
+
+       function getPath() {
+               return $_FILES['qqfile']['tmp_name'];
+       }
+
     function getName() {
         return $_FILES['qqfile']['name'];
     }
@@ -116,6 +249,7 @@ class qqUploadedFileForm {
         return $_FILES['qqfile']['size'];
     }
 }
+
 class qqFileUploader {
     private $allowedExtensions = array();
     private $sizeLimit = 10485760;
@@ -127,8 +261,6 @@ class qqFileUploader {
         $this->allowedExtensions = $allowedExtensions;        
         $this->sizeLimit = $sizeLimit;
         
-        $this->checkServerSettings();       
-
         if (isset($_GET['qqfile'])) {
             $this->file = new qqUploadedFileXhr();
         } elseif (isset($_FILES['qqfile'])) {
@@ -136,17 +268,9 @@ class qqFileUploader {
         } else {
             $this->file = false; 
         }
+
     }
     
-    private function checkServerSettings(){        
-        $postSize = $this->toBytes(ini_get('post_max_size'));
-        $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));        
-               logger('mod/photos.php: qqFileUploader(): upload_max_filesize=' . $uploadSize , 'LOGGER_DEBUG');
-        if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
-            $size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';             
-            die("{'error':'increase post_max_size and upload_max_filesize to $size'}");    
-        }        
-    }
     
     private function toBytes($str){
         $val = trim($str);
@@ -162,10 +286,7 @@ class qqFileUploader {
     /**
      * Returns array('success'=>true) or array('error'=>'error message')
      */
-    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
-        if (!is_writable($uploadDirectory)){
-            return array('error' => t('Server error. Upload directory isn't writable.'));
-        }
+    function handleUpload(){
         
         if (!$this->file){
             return array('error' => t('No files were uploaded.'));
@@ -192,7 +313,7 @@ class qqFileUploader {
 
         $pathinfo = pathinfo($this->file->getName());
         $filename = $pathinfo['filename'];
-        //$filename = md5(uniqid());
+
         $ext = $pathinfo['extension'];
 
         if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
@@ -200,18 +321,18 @@ class qqFileUploader {
             return array('error' => t('File has an invalid extension, it should be one of ') . $these . '.');
         }
         
-        if(!$replaceOldFile){
-            /// don't overwrite previous files that were uploaded
-            while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
-                $filename .= rand(10, 99);
-            }
-        }
-        
-        if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
-            return array('success'=>true,'filename' => $filename . '.' . $ext);
+        if ($this->file->save()){
+            return array(
+                               'success'=>true,
+                               'path' => $this->file->getPath(), 
+                               'filename' => $filename . '.' . $ext
+                       );
         } else {
-            return array('error'=> t('Could not save uploaded file.') .
-                t('The upload was cancelled, or server error encountered'),'filename' => $filename . '.' . $ext);
+            return array(
+                               'error'=> t('Upload was cancelled, or server error encountered'),
+                               'path' => $this->file->getPath(), 
+                               'filename' => $filename . '.' . $ext
+                       );
         }
         
     }