mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-18 15:33:15 +00:00
PHRAS-3519_upload-tmp-then-move
implement atomic (?) "tmp+move" method on uploaded file add traces of document filesize
This commit is contained in:
@@ -34,6 +34,8 @@ use Alchemy\Phrasea\Model\Entities\LazaretSession;
|
||||
use PHPExiftool\Driver\Metadata\Metadata;
|
||||
use PHPExiftool\Driver\Value\Mono as MonoValue;
|
||||
use PHPExiftool\Driver\Value\Multi;
|
||||
use Symfony\Component\EventDispatcher\Event;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
|
||||
/**
|
||||
* Phraseanet Border Manager
|
||||
@@ -381,12 +383,27 @@ class Manager
|
||||
sprintf("calling replaceMetadata")
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
/** @var EventDispatcherInterface $dispatcher */
|
||||
$dispatcher = $this->app['dispatcher'];
|
||||
$dispatcher->addListener(
|
||||
RecordEvents::METADATA_CHANGED,
|
||||
function (Event $event) {
|
||||
// we do not want replaceMetadata() to send a writemeta
|
||||
// file_put_contents(dirname(__FILE__).'/../../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
// sprintf("---------- event METADATA_CHANGED catched !!! Propagation stopped !!!")
|
||||
// ), FILE_APPEND | LOCK_EX);
|
||||
// $event->stopPropagation();
|
||||
},
|
||||
10
|
||||
);
|
||||
|
||||
|
||||
/** @var PhraseanetMetadataSetter $phraseanetMetadataSetter */
|
||||
$phraseanetMetadataSetter = $this->app['phraseanet.metadata-setter'];
|
||||
$phraseanetMetadataSetter->replaceMetadata($newMetadata, $element);
|
||||
|
||||
if(!$nosubdef) {
|
||||
$this->app['dispatcher']->dispatch(RecordEvents::SUBDEFINITION_CREATE, new SubdefinitionCreateEvent($element, true));
|
||||
$dispatcher->dispatch(RecordEvents::SUBDEFINITION_CREATE, new SubdefinitionCreateEvent($element, true));
|
||||
}
|
||||
|
||||
return $element;
|
||||
|
@@ -142,6 +142,17 @@ class FilesystemService
|
||||
return $realPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* rename file from source to target
|
||||
*
|
||||
* @param string $source
|
||||
* @param string $target
|
||||
*/
|
||||
public function rename($source, $target)
|
||||
{
|
||||
$this->filesystem->rename($source, $target, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy file from source to target
|
||||
*
|
||||
|
@@ -12,27 +12,27 @@ namespace Alchemy\Phrasea\Media;
|
||||
|
||||
use Alchemy\Phrasea\Application;
|
||||
use Alchemy\Phrasea\Application\Helper\DispatcherAware;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreatedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreatedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreationEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationFailedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\RecordEvents;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreatedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionCreationFailedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreatedEvent;
|
||||
use Alchemy\Phrasea\Core\Event\Record\SubDefinitionsCreationEvent;
|
||||
use Alchemy\Phrasea\Databox\Subdef\MediaSubdefRepository;
|
||||
use Alchemy\Phrasea\Filesystem\FilesystemService;
|
||||
use Alchemy\Phrasea\Media\Subdef\Specification\PdfSpecification;
|
||||
use MediaAlchemyst\Alchemyst;
|
||||
use MediaAlchemyst\Exception\ExceptionInterface as MediaAlchemystException;
|
||||
use MediaAlchemyst\Exception\FileNotFoundException;
|
||||
use MediaAlchemyst\Specification\Image;
|
||||
use MediaAlchemyst\Specification\Video;
|
||||
use MediaVorus\Exception\FileNotFoundException as MediaVorusFileNotFoundException;
|
||||
use MediaVorus\MediaVorus;
|
||||
use MediaAlchemyst\Exception\ExceptionInterface as MediaAlchemystException;
|
||||
use Neutron\TemporaryFilesystem\Manager;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Unoconv\Exception\ExceptionInterface as UnoconvException;
|
||||
use Unoconv\Exception\RuntimeException;
|
||||
use Unoconv\Unoconv;
|
||||
use MediaVorus\Exception\FileNotFoundException as MediaVorusFileNotFoundException;
|
||||
use MediaAlchemyst\Exception\FileNotFoundException;
|
||||
|
||||
class SubdefGenerator
|
||||
{
|
||||
@@ -107,6 +107,15 @@ class SubdefGenerator
|
||||
)
|
||||
);
|
||||
|
||||
if(!is_null($hd = $record->get_hd_file())) {
|
||||
$hd = $hd->getRealPath();
|
||||
|
||||
clearstatcache(true, $hd);
|
||||
file_put_contents(dirname(__FILE__).'/../../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("creating subdefs for %s.%s from document \"%s\" (size=%s)", $record->getDataboxId(), $record->getRecordId(), $hd, filesize($hd))
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
}
|
||||
|
||||
$mediaCreated = [];
|
||||
foreach ($subdefs as $subdef) {
|
||||
$subdefname = $subdef->get_name();
|
||||
@@ -118,7 +127,13 @@ class SubdefGenerator
|
||||
$pathdest = null;
|
||||
|
||||
if ($record->has_subdef($subdefname) && $record->get_subdef($subdefname)->is_physically_present()) {
|
||||
|
||||
$pathdest = $record->get_subdef($subdefname)->getRealPath();
|
||||
|
||||
file_put_contents(dirname(__FILE__).'/../../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("deleting previous subdef \"%s\" (file=\"%s\") for %s.%s", $subdefname, $pathdest, $record->getDataboxId(), $record->getRecordId())
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
$record->get_subdef($subdefname)->remove_file();
|
||||
$this->logger->info(sprintf('Removed old file for %s', $subdefname));
|
||||
$record->clearSubdefCache($subdefname);
|
||||
|
@@ -96,8 +96,37 @@ class PhraseanetMetadataSetter
|
||||
sprintf("calling set_metadatas for %s.%s", $record->getDataboxId(), $record->getRecordId())
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
$record->set_metadatas($metadataInRecordFormat, true);
|
||||
/*
|
||||
* todo : tryout to write meta AFTER meta was written in db by set_metadatas()
|
||||
* how : uncomment section
|
||||
*
|
||||
*/
|
||||
/*
|
||||
$this->dispatcher->addListener(
|
||||
RecordEvents::METADATA_CHANGED,
|
||||
function () use ($record) {
|
||||
// order to write meta in file
|
||||
file_put_contents(dirname(__FILE__).'/../../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("dispatch WorkerEvents::RECORDS_WRITE_META for %s.%s", $record->getDataboxId(), $record->getRecordId())
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
// this event will add a msg to the writemeta q
|
||||
$this->dispatcher->dispatch(WorkerEvents::RECORDS_WRITE_META,
|
||||
new RecordsWriteMetaEvent([$record->getRecordId()], $record->getDataboxId()));
|
||||
},
|
||||
0
|
||||
);
|
||||
*/
|
||||
/*
|
||||
* end of section to uncomment
|
||||
*/
|
||||
|
||||
$record->set_metadatas($metadataInRecordFormat, true); // will send METADATA_CHANGED when done
|
||||
|
||||
/*
|
||||
* todo : tryout to write meta AFTER meta was written in db by set_metadatas()
|
||||
* how : comment section
|
||||
*
|
||||
*/
|
||||
// order to write meta in file
|
||||
file_put_contents(dirname(__FILE__).'/../../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("dispatch WorkerEvents::RECORDS_WRITE_META for %s.%s", $record->getDataboxId(), $record->getRecordId())
|
||||
@@ -105,6 +134,9 @@ class PhraseanetMetadataSetter
|
||||
|
||||
$this->dispatcher->dispatch(WorkerEvents::RECORDS_WRITE_META,
|
||||
new RecordsWriteMetaEvent([$record->getRecordId()], $record->getDataboxId()));
|
||||
/*
|
||||
* end of section to comment
|
||||
*/
|
||||
}
|
||||
else {
|
||||
|
||||
|
@@ -1700,12 +1700,31 @@ class record_adapter implements RecordInterface, cache_cacheableInterface
|
||||
|
||||
$pathhd = $filesystem->generateDataboxDocumentBasePath($databox);
|
||||
$newname = $filesystem->generateDocumentFilename($record, $file->getFile());
|
||||
$newname_tmp = $newname.".tmp";
|
||||
|
||||
clearstatcache(true, $file->getFile()->getRealPath());
|
||||
file_put_contents(dirname(__FILE__).'/../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("copy \"%s\" to \"%s\"", $file->getFile()->getRealPath(), $pathhd . $newname)
|
||||
sprintf("copying \"%s\" (size=%s) to \"%s\"", $file->getFile()->getRealPath(), filesize($file->getFile()->getRealPath()), $pathhd . $newname_tmp)
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
$filesystem->copy($file->getFile()->getRealPath(), $pathhd . $newname_tmp);
|
||||
|
||||
clearstatcache(true, $pathhd . $newname_tmp);
|
||||
file_put_contents(dirname(__FILE__).'/../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("copied \"%s\" to \"%s\" (size=%s)", $file->getFile()->getRealPath(), $pathhd . $newname_tmp, filesize($pathhd . $newname_tmp))
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
file_put_contents(dirname(__FILE__).'/../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("moving \"%s\" (size=%s) to \"%s\"", $pathhd . $newname_tmp, filesize($pathhd . $newname_tmp), $pathhd . $newname)
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
$filesystem->rename($pathhd . $newname_tmp, $pathhd . $newname);
|
||||
|
||||
clearstatcache(true, $pathhd . $newname);
|
||||
file_put_contents(dirname(__FILE__).'/../../../logs/trace.txt', sprintf("%s [%s] : %s (%s); %s\n", (date('Y-m-d\TH:i:s')), getmypid(), __FILE__, __LINE__,
|
||||
sprintf("moved \"%s\"to \"%s\" (size=%s) ", $pathhd . $newname_tmp, $pathhd . $newname, filesize($pathhd . $newname))
|
||||
), FILE_APPEND | LOCK_EX);
|
||||
|
||||
$filesystem->copy($file->getFile()->getRealPath(), $pathhd . $newname);
|
||||
|
||||
$media = $app->getMediaFromUri($pathhd . $newname);
|
||||
media_subdef::create($app, $record, 'document', $media);
|
||||
|
Reference in New Issue
Block a user