issue #389 partial back-end implementation of multiple formats web upload

This commit is contained in:
plegall
2022-05-31 12:05:27 +02:00
parent 63414deadd
commit 3a63eccb0e
4 changed files with 243 additions and 9 deletions
+68
View File
@@ -427,6 +427,74 @@ SELECT
return $image_id;
}
function add_format($source_filepath, $format_ext, $format_of)
{
// 1) find infos about the extended image
//
// 2) move uploaded file to upload/2022/05/16/pwg_format/20100122003814-449ada00.cr2
//
// 3) register in database
if (!conf_get_param('enable_formats', false))
{
die('['.__FUNCTION__.'] formats are disabled');
}
if (!in_array($format_ext, conf_get_param('format_ext', array('cr2'))))
{
die('['.__FUNCTION__.'] unexpected format extension "'.$format_ext.'" (authorized extensions: '.implode(', ', conf_get_param('format_ext', array('cr2'))).')');
}
$query = '
SELECT
path
FROM '.IMAGES_TABLE.'
WHERE id = '.$format_of.'
;';
$images = query2array($query);
if (!isset($images[0]))
{
die('['.__FUNCTION__.'] this photo does not exist in the database');
}
$format_path = dirname($images[0]['path']).'/pwg_format/';
$format_path.= get_filename_wo_extension(basename($images[0]['path']));
$format_path.= '.'.$format_ext;
prepare_directory(dirname($format_path));
if (is_uploaded_file($source_filepath))
{
move_uploaded_file($source_filepath, $format_path);
}
else
{
rename($source_filepath, $format_path);
}
@chmod($format_path, 0644);
$file_infos = pwg_image_infos($format_path);
$insert = array(
'image_id' => $format_of,
'ext' => $format_ext,
'filesize' => $file_infos['filesize'],
);
single_insert(IMAGE_FORMAT_TABLE, $insert);
$format_id = pwg_db_insert_id(IMAGE_FORMAT_TABLE);
pwg_activity('photo', $format_of, 'edit', array('action'=>'add format', 'format_ext'=>$format_ext, 'format_id'=>$format_id));
$format_infos = $insert;
$format_infos['format_id'] = $format_id;
trigger_notify('loc_end_add_format', $format_infos);
return $format_id;
}
add_event_handler('upload_file', 'upload_file_pdf');
function upload_file_pdf($representative_ext, $file_path)
{
@@ -69,6 +69,7 @@ var batch_Label = "{'Manage this set of %d photos'|translate}";
var albumSummary_label = "{'Album "%s" now contains %d photos'|translate|escape}";
var uploadedPhotos = [];
var uploadCategory = null;
var uploadFormats = true;
{literal}
jQuery(document).ready(function(){
@@ -149,6 +150,50 @@ jQuery(document).ready(function(){
}
},
FilesAdded: function(up, files) {
console.log("FilesAdded");
// Création de la liste avec plupload_id : image_name
fileNames = {};
files.forEach((file) => {
console.log(file)
fileNames[file.id] = file.name;
});
//ajax qui renvois les id des images dans la gallerie.
jQuery.ajax({
url: "ws.php?format=json&method=pwg.images.formats.searchImage",
type: "POST",
data: {
category_id: jQuery("select[name=category] option:selected").val(),
filename_list: JSON.stringify(fileNames),
},
success: function(data) {
//les data qui sont renvoyées avec plupload_id : piwigo_id
var data = JSON.parse(data);
console.log(data.result);
// data = {o_1g369r2011io3v2k1hmn1fc11m7a : 42, o_1g36a8kgutjjajjpb9agvb16a : 69};
console.log("FilesInAjax");
for (const [plupload_id, piwigo_data] of Object.entries(data.result)) {
console.log(plupload_id+': '+piwigo_data.image_id);
files.forEach((file) => {
if (file.id == plupload_id) {
file.format_of = piwigo_data.image_id;
}
})
}
}
});
//vérifier qu'on a bien format_of ici
console.log("Files");
console.log(files);
},
UploadProgress: function(up, file) {
jQuery('#uploadingActions .progressbar').width(up.total.percent+'%');
Piecon.setProgress(up.total.percent);
@@ -173,15 +218,18 @@ jQuery(document).ready(function(){
jQuery("select[name=level]").attr("disabled", "disabled");
// You can override settings before the file is uploaded
up.setOption(
'multipart_params',
{
category : jQuery("select[name=category] option:selected").val(),
level : jQuery("select[name=level] option:selected").val(),
pwg_token : pwg_token
// name : file.name
}
);
var options = {
category : jQuery("select[name=category] option:selected").val(),
level : jQuery("select[name=level] option:selected").val(),
pwg_token : pwg_token
// name : file.name
};
if (uploadFormats) {
options.format_of = file.format_of;
}
up.setOption('multipart_params', options);
},
FileUploaded: function(up, file, info) {
+101
View File
@@ -1317,6 +1317,28 @@ function ws_images_upload($params, $service)
return new PwgError(403, 'Invalid security token');
}
if (isset($params['format_of']))
{
$format_ext = null;
// are formats enabled?
if (!$conf['enable_formats'])
{
return new PwgError(401, 'formats are disabled');
}
// We must check if the extension is in the authorized list.
if (preg_match('/\.('.implode('|', $conf['format_ext']).')$/', $params['name'], $matches))
{
$format_ext = $matches[1];
}
if (empty($format_ext))
{
return new PwgError(401, 'unexpected format extension of file "'.$params['name'].'" (authorized extensions: '.implode(', ', $conf['format_ext']).')');
}
}
// usleep(100000);
// if (!isset($_FILES['image']))
@@ -1405,6 +1427,36 @@ function ws_images_upload($params, $service)
include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
if (isset($params['format_of']))
{
$query='
SELECT *
FROM '.IMAGES_TABLE.'
WHERE id = '. $params['format_of'] .'
;';
$images = query2array($query);
if (count($images) == 0)
{
return new PwgError(404, __FUNCTION__.' : image_id not found');
}
$image = $images[0];
add_format($filePath, $format_ext, $image['id']);
return array(
'image_id' => $image['id'],
'src' => DerivativeImage::thumb_url($image),
'square_src' => DerivativeImage::url(ImageStdParams::get_by_type(IMG_SQUARE), $image),
'name' => $image['name'],
'category' => array(
'id' => $params['category'][0], // not relevant
'nb_photos' => 42, // not relevant, once again
'label' => 'test', // not relevant
)
);
}
$image_id = add_uploaded_file(
$filePath,
stripslashes($params['name']), // function add_uploaded_file will secure before insert
@@ -1806,6 +1858,55 @@ SELECT id, file
return $result;
}
/**
* API method
* Check if an image exists by it's name or md5 sum
*
* @since 13
* @param mixed[] $params
* @option string category_id (optional)
* @option string filename_list
*/
function ws_images_formats_searchImage($params, $service)
{
global $conf, $logger;
$logger->debug(__FUNCTION__, 'WS', $params);
$result = array();
$candidates = json_decode(stripslashes($params['filename_list']), true);
// let's fake it for now: return an id without really testing the match
/*
$unique_filenames_db = array();
$query = '
SELECT
id,
file
FROM '.IMAGES_TABLE.'
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$filename_wo_ext = get_filename_wo_extension($row['file']);
@$unique_filenames_db[ $filename_wo_ext ][] = $row['id'];
}
*/
foreach ($candidates as $format_external_id => $format_filename)
{
$result[$format_external_id] = array(
'status' => 'found', // could be 'not found' or 'multiple'
'image_id' => 84,
);
}
return $result;
}
/**
* API method
* Check is file has been update
+17
View File
@@ -253,6 +253,18 @@ function ws_addDefaultMethods( $arr )
array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.formats.searchImage',
'ws_images_formats_searchImage',
array(
'category_id' => array('type'=>WS_TYPE_ID, 'default'=>null),
'filename_list' => array(),
),
'Search for image ids matching the provided filenames. <b>filename_list</b> must be a JSON encoded associative array of unique_id:filename.<br><br>The method returns a list of unique_id:image_id.',
$ws_functions_root . 'pwg.images.php',
array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.setRank',
'ws_images_setRank',
@@ -452,6 +464,11 @@ function ws_addDefaultMethods( $arr )
'maxValue' => max($conf['available_permission_levels']),
'type' => WS_TYPE_INT|WS_TYPE_POSITIVE
),
'format_of' => array(
'default' => null,
'type' => WS_TYPE_ID,
'info' => 'id of the extended image (name/category/level are not used if format_of is provided)',
),
'pwg_token' => array(),
),
'Add an image.