summaryrefslogtreecommitdiff
path: root/includes/upload_inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/upload_inc.php')
-rw-r--r--includes/upload_inc.php360
1 files changed, 360 insertions, 0 deletions
diff --git a/includes/upload_inc.php b/includes/upload_inc.php
new file mode 100644
index 0000000..90957fb
--- /dev/null
+++ b/includes/upload_inc.php
@@ -0,0 +1,360 @@
+<?php
+/**
+ * @package fisheye
+ * @subpackage functions
+ */
+
+
+
+/**
+ * fisheye_handle_upload
+ */
+function fisheye_handle_upload( &$pFiles ) {
+ global $gBitUser, $gContent, $gBitSystem, $fisheyeErrors, $fisheyeWarnings, $fisheyeSuccess, $gFisheyeUploads;
+
+ // first of all set the execution time for this process to unlimited
+ set_time_limit(0);
+
+ $upImages = array();
+ $upArchives = array();
+ $upErrors = array();
+ $upData = array();
+
+ $i = 0;
+ usort( $pFiles, 'fisheye_sort_uploads' );
+
+ foreach( array_keys( $pFiles ) as $key ) {
+ $pFiles[$key]['type'] = $gBitSystem->verifyMimeType( $pFiles[$key]['tmp_name'] );
+ if( preg_match( '/(^image|pdf|vnd)/i', $pFiles[$key]['type'] ) ) {
+ $upImages[$key] = $pFiles[$key];
+ // clone the request data so edit service values are passed into store process
+ $upData[$key] = $_REQUEST;
+ // add the form data for each upload
+ if( !empty( $_REQUEST['imagedata'][$i] ) ) {
+ array_merge( $upData[$key], $_REQUEST['imagedata'][$i] );
+ }
+ } elseif( !empty( $pFiles[$key]['tmp_name'] ) && !empty( $pFiles[$key]['name'] ) ) {
+ $upArchives[$key] = $pFiles[$key];
+ }
+ $i++;
+ }
+
+ $gallery_additions = array();
+
+ // No gallery was specified, let's try to find one or create one.
+ if( empty( $_REQUEST['gallery_additions'] ) ) {
+ if( $gBitUser->hasPermission( 'p_fisheye_create' )) {
+ $upData['gallery_additions'] = array( fisheye_get_default_gallery_id( $gBitUser->mUserId, $gBitUser->getDisplayName()."'s Gallery" ) );
+ } else {
+ $gBitSystem->fatalError( tra( "You don't have permissions to create a new gallery. Please select an existing one to insert your images to." ));
+ }
+ }
+
+ foreach( array_keys( $upArchives ) as $key ) {
+ $upErrors = fisheye_process_archive( $upArchives[$key], $gContent, TRUE );
+ }
+
+ foreach( array_keys( $upImages ) as $key ) {
+ // resize original if we the user requests it
+ if( !empty( $_REQUEST['resize'] ) ) {
+ $upImages[$key]['resize'] = $_REQUEST['resize'];
+ }
+ $upErrors = array_merge( $upErrors, fisheye_store_upload( $upImages[$key], $upData[$key], !empty( $_REQUEST['rotate_image'] )));
+ }
+
+ if( !is_object( $gContent ) || !$gContent->isValid() ) {
+ $gContent = new FisheyeGallery( $_REQUEST['gallery_additions'][0] );
+ $gContent->load();
+ }
+
+ if( !empty( $gFisheyeUploads ) ){
+ $_REQUEST['uploaded_objects'] = &$gFisheyeUploads;
+ $gContent->invokeServices( "content_post_upload_function", $_REQUEST );
+ }
+
+ return $upErrors;
+}
+
+
+/**
+ * fisheye_sort_upload
+ */
+function fisheye_sort_uploads( $a, $b ) {
+ return strnatcmp( $a['name'], $b['name'] );
+}
+
+/**
+ * fisheye_get_default_gallery_id
+ */
+function fisheye_get_default_gallery_id( $pUserId, $pNewName ) {
+ global $gBitUser;
+ $gal = new FisheyeGallery();
+ $getHash = array( 'user_id' => $pUserId, 'max_records' => 1, 'sort_mode' => 'created_desc', 'show_empty' => TRUE );
+ $upList = $gal->getList( $getHash );
+ if( !empty( $upList ) ) {
+ $ret = key( $upList );
+ } else {
+ $galleryHash = array( 'title' => $pNewName );
+ if( $gal->store( $galleryHash ) ) {
+ $ret = $gal->mGalleryId;
+ }
+ }
+
+ global $gContent;
+ if( $ret && (!is_object( $gContent ) || !$gContent->isValid()) ) {
+ $gContent = new FisheyeGallery( $ret );
+ $gContent->load();
+ }
+ return $ret;
+}
+
+/**
+ * fisheye_store_upload
+ */
+function fisheye_store_upload( &$pFileHash, $pImageData = array(), $pAutoRotate=TRUE ) {
+ global $gBitSystem, $gFisheyeUploads;
+ $ret = array();
+
+ // verifyMimeType to make sure we are working with the proper file type assumptions
+ $pFileHash['type'] = $gBitSystem->verifyMimeType($pFileHash['tmp_name']);
+ if( !empty( $pFileHash ) && ( $pFileHash['size'] > 0 ) && is_file( $pFileHash['tmp_name'] ) && fisheye_verify_upload_item( $pFileHash ) ) {
+ // make a copy for each image we need to store
+ $image = new FisheyeImage();
+ // Store/Update the image
+ $pImageData['_files_override'] = array( $pFileHash );
+ $pImageData['process_storage'] = STORAGE_IMAGE;
+ $pImageData['purge_from_galleries'] = TRUE;
+ // store the image
+ if( !$image->store( $pImageData ) ) {
+ $ret = $image->mErrors;
+ } else {
+ $pFileHash['content_id'] = $image->getField( 'content_id' );
+ $pFileHash['image_id'] = $image->getField( 'image_id' );
+ $image->load();
+ // play with image some more if user has requested it
+ if( $pAutoRotate ) {
+ $image->rotateImage( 'auto' );
+ }
+ $image->addToGalleries( BitBase::getParameter( $pImageData, 'gallery_additions' ) );
+ $gFisheyeUploads[] = $image;
+ }
+
+ // when we're using xupload, we need to remove temp files manually
+ @unlink( $pFileHash['tmp_name'] );
+ }
+ return $ret;
+}
+
+/**
+ * Recursively builds a tree where each directory represents a gallery, and files are assumed to be images.
+ */
+function fisheye_process_archive( &$pFileHash, &$pParentGallery, $pRoot=FALSE ) {
+ global $gBitSystem, $gBitUser;
+ $errors = array();
+
+ if( ( $destDir = liberty_process_archive( $pFileHash ) ) && ( !empty( $_REQUEST['process_archive'] ) || !$gBitUser->hasPermission( 'p_fisheye_upload_nonimages' ) ) ) {
+ if( empty( $pParentGallery ) && !is_file( $pFileHash['tmp_name'] ) ) {
+ $pParentGallery = new FisheyeGallery();
+ $galleryHash = array( 'title' => basename( $destDir ) );
+ if( !$pParentGallery->store( $galleryHash ) ) {
+ $errors = array_merge( $errors, array_values( $pParentGallery->mErrors ) );
+ }
+ global $gContent;
+ $gContent = &$pParentGallery;
+ }
+
+ if( !empty( $pParentGallery ) ) {
+ $pFileHash['gallery_id'] = $pParentGallery->getField( 'gallery_id' );
+ }
+ fisheye_process_directory( $destDir, $pParentGallery, $pRoot );
+ } else {
+ global $gBitUser;
+ if( $gBitUser->hasPermission( 'p_fisheye_upload_nonimages' ) ) {
+ $errors = array_merge( $errors, fisheye_store_upload( $pFileHash ));
+ } else {
+ $errors['upload'] = tra( 'Your upload could not be processed because it was determined to be a non-image and you only have permission to upload images.' );
+ }
+ }
+ return $errors;
+}
+
+if( !function_exists( 'fisheye_verify_upload_item' ) ) {
+// Possible override
+function fisheye_verify_upload_item( $pScanFile ) {
+ global $gBitUser;
+ return $gBitUser->hasPermission( 'p_fisheye_upload_nonimages' ) || preg_match( '/^video\/*/', $pScanFile['type'] ) || preg_match( '/^image\/*/', $pScanFile['type'] ) || preg_match( '/pdf/i', $pScanFile['type'] );
+}
+}
+
+/**
+ * Recursively builds a tree where each directory represents a gallery, and files are assumed to be images.
+ */
+function fisheye_process_directory( $pDestinationDir, &$pParentGallery, $pRoot=FALSE ) {
+ global $gBitSystem, $gBitUser;
+ $errors = array();
+ if( $archiveDir = opendir( $pDestinationDir ) ) {
+ $order = 100;
+ while( $fileName = readdir($archiveDir) ) {
+ $sortedNames[] = $fileName;
+ }
+ sort( $sortedNames );
+ foreach( $sortedNames as $fileName ) {
+ if( $fileName == 'Thumbs.db' ) {
+ unlink( "$pDestinationDir/$fileName" );
+ }
+ if( !preg_match( '/^\./', $fileName ) && ( $fileName != 'Thumbs.db' ) ) {
+ $mimeResults = $gBitSystem->verifyFileExtension( $pDestinationDir.'/'.$fileName );
+ $scanFile = array(
+ 'type' => $mimeResults[1],
+ 'name' => $fileName,
+ 'size' => filesize( "$pDestinationDir/$fileName" ),
+ 'tmp_name' => "$pDestinationDir/$fileName",
+ );
+
+ if( !empty( $_REQUEST['resize'] ) && is_numeric( $_REQUEST['resize'] ) ) {
+ $scanFile['max_height'] = $scanFile['max_width'] = $_REQUEST['resize'];
+ }
+
+ if( is_dir( $pDestinationDir.'/'.$fileName ) ) {
+ if( $fileName == '__MACOSX' ) {
+ // Mac OS resources file
+ unlink_r( $pDestinationDir.'/'.$fileName );
+ } else {
+ // We found a new Gallery!
+ $newGallery = new FisheyeGallery();
+ $galleryHash = array( 'title' => str_replace( '_', ' ', $fileName ) );
+ if( $newGallery->store( $galleryHash ) ) {
+ if( $pRoot ) {
+ $newGallery->addToGalleries( $_REQUEST['gallery_additions'] );
+ }
+ if( is_object( $pParentGallery ) ) {
+ $pParentGallery->addItem( $newGallery->mContentId, $order );
+ }
+ //recurse down in!
+ $errors = array_merge( $errors, fisheye_process_archive( $scanFile, $newGallery ) );
+ } else {
+ $errors = array_merge( $errors, array_values( $newGallery->mErrors ) );
+ }
+ }
+ } elseif( preg_match( '/.+\/*zip*/', $scanFile['type'] ) ) {
+ //recurse down in!
+ $errors = array_merge( $errors, fisheye_process_archive( $scanFile, $pParentGallery ) );
+ } elseif( fisheye_verify_upload_item( $scanFile ) ) {
+ $newImage = new FisheyeImage();
+ $imageHash = array( '_files_override' => array( $scanFile ) );
+ if( $newImage->store( $imageHash ) ) {
+ if( $pRoot ) {
+ $newImage->addToGalleries( $_REQUEST['gallery_additions'] );
+ }
+ if( !is_object( $pParentGallery ) ) {
+ global $gBitUser;
+ $pParentGallery = new FisheyeGallery( fisheye_get_default_gallery_id( $gBitUser->mUserId, $gBitUser->getDisplayName()."'s Gallery" ) );
+ $pParentGallery->load();
+ }
+ $pParentGallery->addItem( $newImage->mContentId );
+ } else {
+ $errors = array_merge( $errors, array_values( $newImage->mErrors ) );
+ }
+ } elseif( is_file( $scanFile['tmp_name'] ) ) {
+ // unknown file type, let's be tidy and clean it up
+ unlink( $scanFile['tmp_name'] );
+ }
+ $order += 10;
+ }
+ }
+ if ( !is_windows() ) {
+ unlink_r( $pDestinationDir );
+ }
+ }
+ return $errors;
+}
+
+
+// this function will process a directory and all it's sub directories without
+// making any assumptions. hierarchy of sub directories is maintained and
+// archives can be processed or simply added to the galleries.
+function fisheye_process_ftp_directory( $pProcessDir ) {
+ global $gBitSystem, $gBitUser;
+ if( empty( $_REQUEST['gallery_additions'] ) ) {
+ $_REQUEST['gallery_additions'] = array();
+ }
+
+ $errors = array();
+ if( $archiveDir = opendir( $pProcessDir ) ) {
+ $order = 100;
+ while( $fileName = readdir($archiveDir) ) {
+ $sortedNames[] = $fileName;
+ }
+
+ sort( $sortedNames );
+ $order = 100;
+
+ foreach( $sortedNames as $fileName ) {
+ if( !preg_match( '/^\./', $fileName ) && ( $fileName != 'Thumbs.db' ) ) {
+ $scanFile = array(
+ 'type' => $gBitSystem->lookupMimeType( substr( $fileName, ( strrpos( $fileName, '.' ) + 1 ) ) ),
+ 'name' => $fileName,
+ 'size' => filesize( "$pProcessDir/$fileName" ),
+ 'tmp_name' => "$pProcessDir/$fileName",
+ );
+
+ if( is_dir( $pProcessDir.'/'.$fileName ) ) {
+ // create a new gallery from directory
+ $dirGallery = new FisheyeGallery();
+ $galleryHash = array( 'title' => str_replace( '_', ' ', $fileName ) );
+ if( $dirGallery->store( $galleryHash ) ) {
+ $dirGallery->addToGalleries( $_REQUEST['gallery_additions'] );
+ $errors = array_merge( $errors, fisheye_process_directory( $pProcessDir.'/'.$fileName, $dirGallery ) );
+ } else {
+ $errors = array_merge( $errors, array_values( $dirGallery->mErrors ) );
+ }
+ unset( $dirGallery );
+ } else {
+ if( preg_match( '/(^image|pdf)/i', $scanFile['type'] ) ) {
+ // process image
+ $newImage = new FisheyeImage();
+ $imageHash = array( 'upload' => $scanFile );
+ if( $newImage->store( $imageHash ) ) {
+ $newImage->addToGalleries( $_REQUEST['gallery_additions'] );
+
+ // if we have a gallery to add these images to, load one of them
+ if( !empty( $_REQUEST['gallery_additions'][0] ) && @!is_object( $imageGallery ) ) {
+ $imageGallery = new FisheyeGallery();
+ $imageGallery->mGalleryId = $_REQUEST['gallery_additions'][0];
+ $imageGallery->load();
+ }
+
+ if( @!is_object( $imageGallery ) ) {
+ global $gBitUser;
+ $galleryHash = array( 'title' => $gBitUser->getDisplayName()."'s Gallery" );
+ $imageGallery = new FisheyeGallery();
+ if( $imageGallery->store( $galleryHash ) ) {
+ $imageGallery->load();
+ } else {
+ $errors = array_merge( $errors, array_values( $imageGallery->mErrors ) );
+ }
+ }
+
+ $imageGallery->addItem( $newImage->mContentId );
+ } else {
+ $errors = array_merge( $errors, array_values( $newImage->mErrors ) );
+ }
+ } else {
+ // create a new gallery from archive
+ $archiveGallery = new FisheyeGallery();
+ $galleryHash = array( 'title' => substr( $fileName, 0, ( str_replace( '_', ' ', strrpos( $fileName, '.' ) ) ) ) );
+ if( !$archiveGallery->store( $galleryHash ) ) {
+ $errors = array_merge( $errors, array_values( $archiveGallery->mErrors ) );
+ }
+
+ $errors = fisheye_process_archive( $scanFile, $archiveGallery, TRUE );
+ unset( $archiveGallery );
+ }
+ }
+ $order += 10;
+ }
+ }
+ }
+ return $errors;
+}
+?>