]> git.mxchange.org Git - friendica.git/blobdiff - addon/js_upload/js_upload.php
Added plural string for contact block
[friendica.git] / addon / js_upload / js_upload.php
index 143f9ba337164051ea95f3fc51dfa145eb6873f4..9f3fa960096ee04ba2204dcad5077b118998478c 100644 (file)
 <?php
 
+/**
+ *
+ * JavaScript Photo/Image Uploader
+ *
+ * Uses Valum 'qq' Uploader. 
+ * Module Author: Chris Case
+ *
+ * Prior to enabling, ensure that you have a directory 'uploads'
+ * which is writable by the web server.
+ *
+ */
+
 
 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) {
+
+                       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")
@@ -26,7 +125,9 @@ function js_upload_post_init(&$a,&$b) {
        $sizeLimit = 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);
@@ -36,22 +137,26 @@ function js_upload_post_init(&$a,&$b) {
                killme();
        }
 
+       $a->data['upload_result'] = $result;
 
 }
 
-function js_upload_photo_post_file(&$a,&$b) {
+function js_upload_post_file(&$a,&$b) {
+
+       $result = $a->data['upload_result'];
 
-       $b['src']               = 'uploads/'.$result['filename'];
+       $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 +167,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 +209,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 +234,7 @@ class qqUploadedFileForm {
         return $_FILES['qqfile']['size'];
     }
 }
+
 class qqFileUploader {
     private $allowedExtensions = array();
     private $sizeLimit = 10485760;
@@ -136,6 +255,7 @@ class qqFileUploader {
         } else {
             $this->file = false; 
         }
+
     }
     
     private function checkServerSettings(){        
@@ -162,10 +282,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 +309,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 +317,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
+                       );
         }
         
     }