From 70bcfb5b861894ecfc5df386921586e3b2ff2555 Mon Sep 17 00:00:00 2001 From: plegall Date: Tue, 27 May 2014 14:11:23 +0000 Subject: feature 2616: HTML5 upload (with plupload 2.1.2). First basic implementation. Needs customization. Chunked upload + Drag & drop (no more Flash) use a new specific API method pwg.images.upload git-svn-id: http://piwigo.org/svn/trunk@28545 68402e56-0260-453c-a942-63ccdbb3a9ee --- include/ws_functions/pwg.images.php | 140 ++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) (limited to 'include/ws_functions') diff --git a/include/ws_functions/pwg.images.php b/include/ws_functions/pwg.images.php index 78d1d51d7..6e224e6e4 100644 --- a/include/ws_functions/pwg.images.php +++ b/include/ws_functions/pwg.images.php @@ -1242,6 +1242,146 @@ SELECT id, name, permalink ); } +/** + * API method + * Adds a image (simple way) + * @param mixed[] $params + * @option int[] category + * @option string name (optional) + * @option string author (optional) + * @option string comment (optional) + * @option int level + * @option string|string[] tags + * @option int image_id (optional) + */ +function ws_images_upload($params, $service) +{ + global $conf; + + if (get_pwg_token() != $params['pwg_token']) + { + return new PwgError(403, 'Invalid security token'); + } + + // usleep(100000); + + // if (!isset($_FILES['image'])) + // { + // return new PwgError(405, 'The image (file) is missing'); + // } + + // file_put_contents('/tmp/plupload.log', "[".date('c')."] ".__FUNCTION__."\n\n", FILE_APPEND); + // file_put_contents('/tmp/plupload.log', '$_FILES = '.var_export($_FILES, true)."\n", FILE_APPEND); + // file_put_contents('/tmp/plupload.log', '$_POST = '.var_export($_POST, true)."\n", FILE_APPEND); + + $upload_dir = $conf['upload_dir'].'/buffer'; + + // create the upload directory tree if not exists + if (!mkgetdir($upload_dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR)) + { + return new PwgError(500, 'error during buffer directory creation'); + } + + // Get a file name + if (isset($_REQUEST["name"])) + { + $fileName = $_REQUEST["name"]; + } + elseif (!empty($_FILES)) + { + $fileName = $_FILES["file"]["name"]; + } + else + { + $fileName = uniqid("file_"); + } + + $filePath = $upload_dir.DIRECTORY_SEPARATOR.$fileName; + + // Chunking might be enabled + $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; + $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; + + file_put_contents('/tmp/plupload.log', "[".date('c')."] ".__FUNCTION__.', '.$fileName.' '.($chunk+1).'/'.$chunks."\n", FILE_APPEND); + + single_insert( + 'plupload', + array( + 'received_on' => date('c'), + 'filename' => $fileName, + 'chunk' => $chunk+1, + 'chunks' => $chunks, + ) + ); + + + // Open temp file + if (!$out = @fopen("{$filePath}.part", $chunks ? "ab" : "wb")) + { + die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); + } + + if (!empty($_FILES)) + { + if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) + { + die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); + } + + // Read binary input stream and append it to temp file + if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) + { + die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); + } + } + else + { + if (!$in = @fopen("php://input", "rb")) + { + die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); + } + } + + while ($buff = fread($in, 4096)) + { + fwrite($out, $buff); + } + + @fclose($out); + @fclose($in); + + // Check if file has been uploaded + if (!$chunks || $chunk == $chunks - 1) + { + // Strip the temp .part suffix off + rename("{$filePath}.part", $filePath); + + include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); + + $image_id = add_uploaded_file( + $filePath, + $params['name'], + $params['category'], + $params['level'], + null // image_id = not provided, this is a new photo + ); + + $query = ' +SELECT + id, + path + FROM '.IMAGES_TABLE.' + WHERE id = '.$image_id.' +;'; + $image_infos = pwg_db_fetch_assoc(pwg_query($query)); + + return array( + 'image_id' => $image_id, + 'src' => DerivativeImage::thumb_url($image_infos), + ); + } +} + /** * API method * Check if an image exists by it's name or md5 sum -- cgit v1.2.3