[TYPO3-dev] Re: [Typo3-dev] TCEmain Hook processing of uploaded files
stefano cecere
scecere at krur.com
Wed Mar 21 19:57:09 CET 2007
anybody knows if this XClass is still needed? (it's for 3.7)
stefano
Christoph Köpernick @ proSystem Media GmbH wrote:
> I´ve found the solution myself, I hope somebody could help this too.
>
> I made a XCLASS extension for TCEmain function
> checkValue_group_select_file().
>
> For case 1:
> Edit TCEform and remove multiple="multiple" doesn´t take effect, because
> the JS of the element browser makes it multiple, if you add an file
> through the element browser. Because I don´t want multiple files in the
> array I added the following at the beginning of
> checkValue_group_select_file().:
>
> if($valueArray[0] && $uploadedFileArray[tmp_name]) {
> unset($uploadedFileArray);
> }
>
> If a file is already in the field, and a new one is provided the new is
> discarded. If a user wants to overwrite the file he has to remove it
> first by clicking on the trash (saving directly after this isn´t needed
> anymore).
>
> For case 2:
> The files are removed AFTER trying to write the new files, see
> #$this->removeFilesStore
>
> So I changed $this->removeFilesStore[]=$dest.'/'.$theFile; to
> unlink($dest.'/'.$theFile); Now the file is removed (unlinked)
> instantly.
>
> Here is my full XCLASS:
>
> <?php
> /**
> * User-Extension of TCEmain class
> *
> * @author Christoph Koepernick <christoph at psysm.com>
> */
>
> class ux_t3lib_TCEmain extends t3lib_TCEmain {
>
>
> function
> checkValue_group_select_file($valueArray,$tcaFieldConf,$curValue,$upload
> edFileArray,$status,$table,$id,$recFID) {
>
> if($valueArray[0] && $uploadedFileArray[tmp_name]) {
> unset($uploadedFileArray);
> }
>
>
> // If any files are uploaded:
> if (is_array($uploadedFileArray) &&
> $uploadedFileArray['name'] &&
> strcmp($uploadedFileArray['tmp_name'],'none')) {
> $valueArray[]=$uploadedFileArray['tmp_name'];
>
> $this->alternativeFileName[$uploadedFileArray['tmp_name']] =
> $uploadedFileArray['name'];
> }
>
> // Creating fileFunc object.
> if (!$this->fileFunc) {
> $this->fileFunc =
> t3lib_div::makeInstance('t3lib_basicFileFunctions');
> $this->include_filefunctions=1;
> }
> // Setting permitted extensions.
> $all_files = Array();
> $all_files['webspace']['allow'] = $tcaFieldConf['allowed'];
> $all_files['webspace']['deny'] = $tcaFieldConf['disallowed']
> ? $tcaFieldConf['disallowed'] : '*';
> $all_files['ftpspace'] = $all_files['webspace'];
> $this->fileFunc->init('', $all_files);
>
> // If there is an upload folder defined:
> if ($tcaFieldConf['uploadfolder']) {
> // For logging..
> $propArr = $this->getRecordProperties($table,$id);
>
> // Get destrination path:
> $dest =
> $this->destPathFromUploadFolder($tcaFieldConf['uploadfolder']);
>
> // If we are updating:
> if ($status=='update') {
>
> // Finding the CURRENT files listed, either from
> MM or from the current record.
> $theFileValues=array();
> if ($tcaFieldConf['MM']) { // If MM relations
> for the files also!
> $dbAnalysis =
> t3lib_div::makeInstance('t3lib_loadDBGroup');
>
> $dbAnalysis->start('','files',$tcaFieldConf['MM'],$id);
> reset($dbAnalysis->itemArray);
> while
> (list($somekey,$someval)=each($dbAnalysis->itemArray)) {
> if ($someval['id']) {
> $theFileValues[]=$someval['id'];
> }
> }
> } else {
>
> $theFileValues=t3lib_div::trimExplode(',',$curValue,1);
> }
>
> // DELETE files: If existing files were found,
> traverse those and register files for deletion which has been removed:
> if (count($theFileValues)) {
>
> // Traverse the input values and for all
> input values which match an EXISTING value, remove the existing from
> $theFileValues array (this will result in an array of all the existing
> files which should be deleted!)
>
>
>
> foreach($valueArray as $key => $theFile) {
> if ($theFile &&
> !strstr(t3lib_div::fixWindowsFilePath($theFile),'/')) {
> $theFileValues =
> t3lib_div::removeArrayEntryByValue($theFileValues,$theFile);
> }
> }
>
> // This array contains the filenames in the
> uploadfolder that should be deleted:
> foreach($theFileValues as $key => $theFile) {
>
> $theFile = trim($theFile);
> if (@is_file($dest.'/'.$theFile)) {
>
> #$this->removeFilesStore[]=$dest.'/'.$theFile;
> unlink($dest.'/'.$theFile);
> } elseif ($theFile) {
> $this->log($table,$id,5,0,1,"Could not
> delete file '%s' (does not exist). (%s)",10,array($dest.'/'.$theFile,
> $recFID),$propArr['event_pid']);
> }
> }
> }
> }
>
> // Traverse the submitted values:
> foreach($valueArray as $key => $theFile) {
> // NEW FILES? If the value contains '/' it
> indicates, that the file is new and should be added to the uploadsdir
> (whether its absolute or relative does not matter here)
> if
> (strstr(t3lib_div::fixWindowsFilePath($theFile),'/')) {
> // Init:
> $maxSize = intval($tcaFieldConf['max_size']);
> $cmd='';
> $theDestFile=''; // Must be cleared. Else
> a faulty fileref may be inserted if the below code returns an error!!
> (Change: 22/12/2000)
>
> // Check various things before copying file:
> if (@is_dir($dest) && (@is_file($theFile) ||
> @is_uploaded_file($theFile))) { // File and destination must
> exist
>
> // Finding size. For safe_mode we have
> to rely on the size in the upload array if the file is uploaded.
> if (is_uploaded_file($theFile) &&
> $theFile==$uploadedFileArray['tmp_name']) {
> $fileSize = $uploadedFileArray['size'];
> } else {
> $fileSize = filesize($theFile);
> }
>
> if (!$maxSize || $fileSize<=($maxSize*1024))
> { // Check file size:
> // Prepare filename:
> $theEndFileName =
> isset($this->alternativeFileName[$theFile]) ?
> $this->alternativeFileName[$theFile] : $theFile;
> $fI =
> t3lib_div::split_fileref($theEndFileName);
>
> // Check for allowed extension:
> if
> ($this->fileFunc->checkIfAllowed($fI['fileext'], $dest,
> $theEndFileName)) {
>
> $theDestFile =
> $this->fileFunc->getUniqueName($this->fileFunc->cleanFileName($fI['file'
> ]), $dest);
>
> // If we have a unique
> destination filename, then write the file:
> if ($theDestFile) {
>
> t3lib_div::upload_copy_move($theFile,$theDestFile);
> $this->copiedFileMap[$theFile] =
> $theDestFile;
> clearstatcache();
> if (!@is_file($theDestFile))
> $this->log($table,$id,5,0,1,"Copying file '%s' failed!: The destination
> path (%s) may be write protected. Please make it write enabled!.
> (%s)",16,array($theFile, dirname($theDestFile),
> $recFID),$propArr['event_pid']);
> } else
> $this->log($table,$id,5,0,1,"Copying file '%s' failed!: No destination
> file (%s) possible!. (%s)",11,array($theFile, $theDestFile,
> $recFID),$propArr['event_pid']);
> } else
> $this->log($table,$id,5,0,1,"Fileextension '%s' not allowed.
> (%s)",12,array($fI['fileext'], $recFID),$propArr['event_pid']);
> } else $this->log($table,$id,5,0,1,"Filesize
> (%s) of file '%s' exceeds limit (%s).
> (%s)",13,array(t3lib_div::formatSize($fileSize),$theFile,t3lib_div::form
> atSize($maxSize*1024),$recFID),$propArr['event_pid']);
> } else $this->log($table,$id,5,0,1,'The
> destination (%s) or the source file (%s) does not exist.
> (%s)',14,array($dest, $theFile, $recFID),$propArr['event_pid']);
>
> // If the destination file was created, we
> will set the new filename in the value array, otherwise unset the entry
> in the value array!
> if (@is_file($theDestFile)) {
> $info =
> t3lib_div::split_fileref($theDestFile);
> $valueArray[$key]=$info['file']; // The
> value is set to the new filename
> } else {
> unset($valueArray[$key]); // The value is
> set to the new filename
> }
> }
> }
>
> // If MM relations for the files, we will set the
> relations as MM records and change the valuearray to contain a single
> entry with a count of the number of files!
> if ($tcaFieldConf['MM']) {
> $dbAnalysis =
> t3lib_div::makeInstance('t3lib_loadDBGroup');
> $dbAnalysis->tableArray['files']=array(); // dummy
>
> reset($valueArray);
> while (list($key,$theFile)=each($valueArray)) {
> // explode files
> $dbAnalysis->itemArray[]['id']=$theFile;
> }
> if ($status=='update') {
> $dbAnalysis->writeMM($tcaFieldConf['MM'],$id,0);
> } else {
> $this->dbAnalysisStore[] = array($dbAnalysis,
> $tcaFieldConf['MM'], $id, 0); // This will be traversed later to execute
> the actions
> }
> $cc=count($dbAnalysis->itemArray);
> $valueArray = array($cc);
> }
> }
>
>
> return $valueArray;
> }
>
> }
>
> ?>
>
>
> Please write me an email if that also helps for your purpose ;)
>
> Best regards, Christoph Köpernick
>
>
>> -----Ursprüngliche Nachricht-----
>> Von: typo3-dev-bounces at lists.netfielders.de [mailto:typo3-dev-
>> bounces at lists.netfielders.de] Im Auftrag von Christoph Köpernick @
>> proSystem Media GmbH
>> Gesendet: Montag, 26. September 2005 10:54
>> An: typo3-dev at lists.netfielders.de
>> Betreff: [Typo3-dev] TCEmain Hook processing of uploaded files
>>
>> Dear List members,
>>
>> I´d like to preprocess uploaded files in a backend form. So I created
> a
>> hook, that works. But I got some problems with the names of uploaded
>> files.
>>
>> My hook names the uploaded files (only images) in this scheme
>> myextkey_img_1.jpg
>> myextkey_img_2.jpg
>> ...
>>
>> by setting
>>
>> $this->uploadedFileArray['myextkey'][$id]['my'.$k.'img']['name'] =
>> 'myextkey_img_'.$k.'.jpg';
>>
>> Also I want to save them into an extra directory for each $id:
>>
>> $TCA[$table]['columns']['my'.$k.'img']['config']['uploadfolder'] .=
>> '/'.$id];
>>
>> That works too.
>>
>> But two strange cases occur:
>>
>> 1. If an image is already in the select field of the backend form. I
>> don´t click on the trash, browse for files on my PC and then submit
> the
>> form. The new selected image is saved with the postfix _01 and the old
>> image is still in the form.
>>
>> -> Maybe a <select multiple=multiple> problem? But setting multiple=0
> or
>> false in the TCA doesn´t make any effect. How can I get around this?
>>
>>
>> 2. If an image is already in the select field of the backend form. I
> do
>> delete it by clicking on the trash, browse for a new image file on my
> PC
>> and submit. The old image is deleted and the new is saved with postfix
>> _01.
>>
>> -> I´ve no idea how this happens. By looking in the source of tcemain,
> I
>> think the old file is deleted first and then the new file is saved
> (with
>> calling for a unique filename).
>>
>> Now I´ve to delete, save the form, and then select the new to get the
>> right filenames and no problems. I´m using 3.7.0
>>
>> I hope that somebody can help me or make some suggestions how to solve
>> that.
>>
>> Best regards, Christoph Köpernick
>>
>> _______________________________________________
>> Typo3-dev mailing list
>> Typo3-dev at lists.netfielders.de
>> http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-dev
>
More information about the TYPO3-dev
mailing list