2012-05-31 21:08:14 +02:00
< ? php
2018-10-27 14:43:12 +02:00
/* Copyright ( C ) 2011 - 2012 Regis Houssin < regis . houssin @ inodbox . com >
2012-06-09 13:54:05 +02:00
* Copyright ( C ) 2011 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
*
2012-05-31 21:08:14 +02:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2012-05-31 21:08:14 +02:00
* ( at your option ) any later version .
2012-06-09 13:54:05 +02:00
*
2012-05-31 21:08:14 +02:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2012-06-09 13:54:05 +02:00
*
2012-05-31 21:08:14 +02:00
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2012-05-31 21:08:14 +02:00
*/
/**
2019-12-12 08:17:14 +01:00
* \file htdocs / core / class / fileupload . class . php
2012-05-31 21:08:14 +02:00
* \brief File to return Ajax response on file upload
*/
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/images.lib.php' ;
2012-05-31 21:08:14 +02:00
/**
2012-06-09 13:54:05 +02:00
* This class is used to manage file upload using ajax
2012-05-31 21:08:14 +02:00
*/
class FileUpload
{
2012-06-01 07:59:45 +02:00
protected $options ;
protected $fk_element ;
protected $element ;
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
/**
* Constructor
2012-06-01 08:05:45 +02:00
*
2012-05-31 21:08:14 +02:00
* @ param array $options Options array
* @ param int $fk_element fk_element
* @ param string $element element
*/
2019-02-27 23:55:18 +01:00
public function __construct ( $options = null , $fk_element = null , $element = null )
2012-05-31 21:08:14 +02:00
{
global $db , $conf ;
global $object ;
2019-07-04 11:43:17 +02:00
global $hookmanager ;
$hookmanager -> initHooks ( array ( 'fileupload' ));
2012-06-01 08:05:45 +02:00
2020-04-10 10:59:32 +02:00
$this -> fk_element = $fk_element ;
$this -> element = $element ;
2012-06-01 08:05:45 +02:00
2020-04-10 10:59:32 +02:00
$pathname = $filename = $element ;
2021-02-23 22:03:23 +01:00
if ( preg_match ( '/^([^_]+)_([^_]+)/i' , $element , $regs )) {
2012-05-31 21:08:14 +02:00
$pathname = $regs [ 1 ];
$filename = $regs [ 2 ];
}
2012-06-01 08:05:45 +02:00
2013-04-22 12:35:31 +02:00
$parentForeignKey = '' ;
2012-05-31 21:08:14 +02:00
// For compatibility
if ( $element == 'propal' ) {
2012-06-11 21:45:59 +02:00
$pathname = 'comm/propal' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> $element -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'facture' ) {
2012-06-11 21:45:59 +02:00
$pathname = 'compta/facture' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> $element -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'project' ) {
2012-06-11 21:45:59 +02:00
$element = $pathname = 'projet' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> $element -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'project_task' ) {
2021-03-01 20:37:16 +01:00
$pathname = 'projet' ;
$filename = 'task' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> projet -> dir_output ;
2013-04-22 12:35:31 +02:00
$parentForeignKey = 'fk_project' ;
$parentClass = 'Project' ;
$parentElement = 'projet' ;
$parentObject = 'project' ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'fichinter' ) {
2020-04-10 10:59:32 +02:00
$element = 'ficheinter' ;
$dir_output = $conf -> $element -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'order_supplier' ) {
2021-03-01 20:37:16 +01:00
$pathname = 'fourn' ;
$filename = 'fournisseur.commande' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> fournisseur -> commande -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'invoice_supplier' ) {
2021-03-01 20:37:16 +01:00
$pathname = 'fourn' ;
$filename = 'fournisseur.facture' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> fournisseur -> facture -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'product' ) {
2013-04-22 15:26:14 +02:00
$dir_output = $conf -> product -> multidir_output [ $conf -> entity ];
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'productbatch' ) {
2018-04-12 15:10:37 +02:00
$dir_output = $conf -> productbatch -> multidir_output [ $conf -> entity ];
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'action' ) {
2021-03-01 20:37:16 +01:00
$pathname = 'comm/action' ;
$filename = 'actioncomm' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> agenda -> dir_output ;
2020-05-21 15:05:19 +02:00
} elseif ( $element == 'chargesociales' ) {
2021-03-01 20:37:16 +01:00
$pathname = 'compta/sociales' ;
$filename = 'chargesociales' ;
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> tax -> dir_output ;
2012-06-11 21:45:59 +02:00
} else {
2020-04-10 10:59:32 +02:00
$dir_output = $conf -> $element -> dir_output ;
2012-06-09 18:37:54 +02:00
}
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
dol_include_once ( '/' . $pathname . '/class/' . $filename . '.class.php' );
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
$classname = ucfirst ( $filename );
2012-08-05 15:24:28 +02:00
2012-06-11 21:45:59 +02:00
if ( $element == 'order_supplier' ) {
$classname = 'CommandeFournisseur' ;
2012-08-05 15:24:28 +02:00
} elseif ( $element == 'invoice_supplier' ) {
$classname = 'FactureFournisseur' ;
2012-06-11 21:45:59 +02:00
}
2012-08-05 15:24:28 +02:00
2012-05-31 21:08:14 +02:00
$object = new $classname ( $db );
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
$object -> fetch ( $fk_element );
2013-04-22 12:35:31 +02:00
if ( ! empty ( $parentForeignKey )) {
dol_include_once ( '/' . $parentElement . '/class/' . $parentObject . '.class.php' );
$parent = new $parentClass ( $db );
$parent -> fetch ( $object -> $parentForeignKey );
if ( ! empty ( $parent -> socid )) {
$parent -> fetch_thirdparty ();
}
2015-09-24 16:32:48 +02:00
$object -> $parentObject = clone $parent ;
2013-04-22 12:35:31 +02:00
} else {
$object -> fetch_thirdparty ();
}
2012-06-01 08:05:45 +02:00
2012-08-05 18:36:20 +02:00
$object_ref = dol_sanitizeFileName ( $object -> ref );
if ( $element == 'invoice_supplier' ) {
2020-04-10 10:59:32 +02:00
$object_ref = get_exdir ( $object -> id , 2 , 0 , 0 , $object , 'invoice_supplier' ) . $object_ref ;
2019-01-27 10:49:34 +01:00
} elseif ( $element == 'project_task' ) {
2020-04-10 10:59:32 +02:00
$object_ref = $object -> project -> ref . '/' . $object_ref ;
2012-08-05 18:36:20 +02:00
}
2012-06-01 07:59:45 +02:00
$this -> options = array (
2012-05-31 21:08:14 +02:00
'script_url' => $_SERVER [ 'PHP_SELF' ],
2020-04-10 10:59:32 +02:00
'upload_dir' => $dir_output . '/' . $object_ref . '/' ,
2012-08-05 18:36:20 +02:00
'upload_url' => DOL_URL_ROOT . '/document.php?modulepart=' . $element . '&attachment=1&file=/' . $object_ref . '/' ,
2012-05-31 21:08:14 +02:00
'param_name' => 'files' ,
// Set the following option to 'POST', if your server does not support
// DELETE requests. This is a parameter sent to the client:
'delete_type' => 'DELETE' ,
// The php.ini settings upload_max_filesize and post_max_size
// take precedence over the following max_file_size setting:
'max_file_size' => null ,
'min_file_size' => 1 ,
'accept_file_types' => '/.+$/i' ,
// The maximum number of files for the upload directory:
'max_number_of_files' => null ,
2012-07-02 19:30:37 +02:00
// Image resolution restrictions:
'max_width' => null ,
'max_height' => null ,
'min_width' => 1 ,
'min_height' => 1 ,
2012-05-31 21:08:14 +02:00
// Set the following option to false to enable resumable uploads:
'discard_aborted_uploads' => true ,
'image_versions' => array (
// Uncomment the following version to restrict the size of
// uploaded images. You can also add additional versions with
// their own upload directories:
/*
2012-06-01 08:05:45 +02:00
'large' => array (
'upload_dir' => dirname ( $_SERVER [ 'SCRIPT_FILENAME' ]) . '/files/' ,
'upload_url' => $this -> getFullUrl () . '/files/' ,
'max_width' => 1920 ,
'max_height' => 1200 ,
'jpeg_quality' => 95
),
*/
2012-05-31 21:08:14 +02:00
'thumbnail' => array (
2020-04-10 10:59:32 +02:00
'upload_dir' => $dir_output . '/' . $object_ref . '/thumbs/' ,
2012-08-05 18:36:20 +02:00
'upload_url' => DOL_URL_ROOT . '/document.php?modulepart=' . $element . '&attachment=1&file=/' . $object_ref . '/thumbs/' ,
2012-07-02 19:30:37 +02:00
'max_width' => 80 ,
2012-05-31 21:08:14 +02:00
'max_height' => 80
)
)
);
2019-07-04 11:43:17 +02:00
2020-10-31 14:32:18 +01:00
$hookmanager -> executeHooks (
'overrideUploadOptions' ,
array (
'options' => & $options ,
'element' => $element
),
$object ,
$action ,
$hookmanager
);
2019-07-04 11:43:17 +02:00
2012-05-31 21:08:14 +02:00
if ( $options ) {
2012-06-01 07:59:45 +02:00
$this -> options = array_replace_recursive ( $this -> options , $options );
2012-05-31 21:08:14 +02:00
}
}
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
/**
2012-06-09 13:54:05 +02:00
* Return full URL
2012-06-01 08:05:45 +02:00
*
2012-06-09 13:54:05 +02:00
* @ return string URL
2012-05-31 21:08:14 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function getFullUrl ()
{
2012-07-02 19:30:37 +02:00
$https = ! empty ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] !== 'off' ;
return
( $https ? 'https://' : 'http://' ) .
( ! empty ( $_SERVER [ 'REMOTE_USER' ]) ? $_SERVER [ 'REMOTE_USER' ] . '@' : '' ) .
( isset ( $_SERVER [ 'HTTP_HOST' ]) ? $_SERVER [ 'HTTP_HOST' ] : ( $_SERVER [ 'SERVER_NAME' ] .
( $https && $_SERVER [ 'SERVER_PORT' ] === 443 ||
$_SERVER [ 'SERVER_PORT' ] === 80 ? '' : ':' . $_SERVER [ 'SERVER_PORT' ]))) .
2019-01-27 11:55:16 +01:00
substr ( $_SERVER [ 'SCRIPT_NAME' ], 0 , strrpos ( $_SERVER [ 'SCRIPT_NAME' ], '/' ));
2012-05-31 21:08:14 +02:00
}
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
/**
* Set delete url
2012-06-01 08:05:45 +02:00
*
2012-06-09 13:54:05 +02:00
* @ param string $file Filename
* @ return void
2012-05-31 21:08:14 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function setFileDeleteUrl ( $file )
2012-07-02 19:30:37 +02:00
{
$file -> delete_url = $this -> options [ 'script_url' ]
. '?file=' . rawurlencode ( $file -> name ) . '&fk_element=' . $this -> fk_element . '&element=' . $this -> element ;
$file -> delete_type = $this -> options [ 'delete_type' ];
if ( $file -> delete_type !== 'DELETE' ) {
$file -> delete_url .= '&_method=DELETE' ;
}
2012-05-31 21:08:14 +02:00
}
2012-06-01 08:05:45 +02:00
2012-05-31 21:08:14 +02:00
/**
2016-04-09 15:07:55 +02:00
* getFileObject
2012-06-01 08:05:45 +02:00
*
* @ param string $file_name Filename
2018-04-16 13:51:16 +02:00
* @ return stdClass | null
2012-06-01 08:05:45 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function getFileObject ( $file_name )
2012-06-01 08:05:45 +02:00
{
$file_path = $this -> options [ 'upload_dir' ] . $file_name ;
2021-02-23 22:03:23 +01:00
if ( is_file ( $file_path ) && $file_name [ 0 ] !== '.' ) {
2012-06-01 08:05:45 +02:00
$file = new stdClass ();
$file -> name = $file_name ;
2019-01-27 11:55:16 +01:00
$file -> mime = dol_mimetype ( $file_name , '' , 2 );
2012-06-01 08:05:45 +02:00
$file -> size = filesize ( $file_path );
$file -> url = $this -> options [ 'upload_url' ] . rawurlencode ( $file -> name );
2020-04-10 10:59:32 +02:00
foreach ( $this -> options [ 'image_versions' ] as $version => $options ) {
2012-06-01 08:05:45 +02:00
if ( is_file ( $options [ 'upload_dir' ] . $file_name )) {
2020-04-10 10:59:32 +02:00
$tmp = explode ( '.' , $file -> name );
2012-06-01 08:05:45 +02:00
$file -> { $version . '_url' } = $options [ 'upload_url' ] . rawurlencode ( $tmp [ 0 ] . '_mini.' . $tmp [ 1 ]);
}
}
2012-06-09 13:54:05 +02:00
$this -> setFileDeleteUrl ( $file );
2012-06-01 08:05:45 +02:00
return $file ;
}
return null ;
}
/**
2016-04-09 15:07:55 +02:00
* getFileObjects
2012-06-01 08:05:45 +02:00
*
* @ return void
*/
2012-06-09 13:54:05 +02:00
protected function getFileObjects ()
2012-06-01 08:05:45 +02:00
{
2012-06-09 13:54:05 +02:00
return array_values ( array_filter ( array_map ( array ( $this , 'getFileObject' ), scandir ( $this -> options [ 'upload_dir' ]))));
2012-06-01 08:05:45 +02:00
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
2016-04-09 14:12:21 +02:00
* Create thumbs of a file uploaded . Only the " mini " thumb is generated .
2012-06-01 08:05:45 +02:00
*
* @ param string $file_name Filename
* @ param string $options is array ( 'max_width' , 'max_height' )
2016-04-09 19:32:05 +02:00
* @ return boolean
2012-06-01 08:05:45 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function createScaledImage ( $file_name , $options )
2012-06-01 08:05:45 +02:00
{
global $maxwidthmini , $maxheightmini ;
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
$file_path = $this -> options [ 'upload_dir' ] . $file_name ;
$new_file_path = $options [ 'upload_dir' ] . $file_name ;
2021-02-23 22:03:23 +01:00
if ( dol_mkdir ( $options [ 'upload_dir' ]) >= 0 ) {
2012-06-01 08:05:45 +02:00
list ( $img_width , $img_height ) = @ getimagesize ( $file_path );
if ( ! $img_width || ! $img_height ) {
return false ;
}
2020-04-10 10:59:32 +02:00
$res = vignette ( $file_path , $maxwidthmini , $maxheightmini , '_mini' ); // We don't use ->addThumbs here because there is no object and we don't need all thumbs, only the "mini".
2012-06-01 08:05:45 +02:00
2021-02-23 22:03:23 +01:00
if ( preg_match ( '/error/i' , $res )) {
return false ;
}
2012-06-01 08:05:45 +02:00
return true ;
2020-05-21 15:05:19 +02:00
} else {
2012-06-01 08:05:45 +02:00
return false ;
}
}
/**
* Enter description here ...
*
* @ param string $uploaded_file Uploade file
* @ param string $file File
* @ param string $error Error
* @ param string $index Index
2016-04-09 15:07:55 +02:00
* @ return boolean True if OK , False if KO
2012-06-01 08:05:45 +02:00
*/
protected function validate ( $uploaded_file , $file , $error , $index )
{
if ( $error ) {
$file -> error = $error ;
return false ;
}
2012-07-02 19:30:37 +02:00
if ( ! $file -> name ) {
$file -> error = 'missingFileName' ;
return false ;
2012-06-01 08:05:45 +02:00
}
if ( ! preg_match ( $this -> options [ 'accept_file_types' ], $file -> name )) {
$file -> error = 'acceptFileTypes' ;
return false ;
}
if ( $uploaded_file && is_uploaded_file ( $uploaded_file )) {
$file_size = filesize ( $uploaded_file );
} else {
$file_size = $_SERVER [ 'CONTENT_LENGTH' ];
}
if ( $this -> options [ 'max_file_size' ] && (
$file_size > $this -> options [ 'max_file_size' ] ||
$file -> size > $this -> options [ 'max_file_size' ])
) {
$file -> error = 'maxFileSize' ;
return false ;
}
if ( $this -> options [ 'min_file_size' ] &&
$file_size < $this -> options [ 'min_file_size' ]) {
$file -> error = 'minFileSize' ;
return false ;
}
2014-06-09 15:21:20 +02:00
if ( is_numeric ( $this -> options [ 'max_number_of_files' ]) && (
2012-06-09 13:54:05 +02:00
count ( $this -> getFileObjects ()) >= $this -> options [ 'max_number_of_files' ])
2012-06-01 08:05:45 +02:00
) {
$file -> error = 'maxNumberOfFiles' ;
return false ;
}
list ( $img_width , $img_height ) = @ getimagesize ( $uploaded_file );
2014-06-09 15:21:20 +02:00
if ( is_numeric ( $img_width )) {
2012-06-01 08:05:45 +02:00
if ( $this -> options [ 'max_width' ] && $img_width > $this -> options [ 'max_width' ] ||
$this -> options [ 'max_height' ] && $img_height > $this -> options [ 'max_height' ]) {
$file -> error = 'maxResolution' ;
return false ;
}
if ( $this -> options [ 'min_width' ] && $img_width < $this -> options [ 'min_width' ] ||
$this -> options [ 'min_height' ] && $img_height < $this -> options [ 'min_height' ]) {
$file -> error = 'minResolution' ;
return false ;
}
}
return true ;
}
/**
* Enter description here ...
*
2012-06-09 13:54:05 +02:00
* @ param int $matches ? ? ?
* @ return string ? ? ?
2012-06-01 08:05:45 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function upcountNameCallback ( $matches )
2012-07-02 19:30:37 +02:00
{
$index = isset ( $matches [ 1 ]) ? intval ( $matches [ 1 ]) + 1 : 1 ;
$ext = isset ( $matches [ 2 ]) ? $matches [ 2 ] : '' ;
return ' (' . $index . ')' . $ext ;
2012-06-01 08:05:45 +02:00
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
* Enter description here ...
*
2012-06-09 13:54:05 +02:00
* @ param string $name ? ? ?
* @ return string ? ? ?
2012-06-01 08:05:45 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function upcountName ( $name )
2012-07-02 19:30:37 +02:00
{
return preg_replace_callback ( '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/' , array ( $this , 'upcountNameCallback' ), $name , 1 );
2012-06-01 08:05:45 +02:00
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
2016-04-09 19:42:34 +02:00
* trimFileName
2012-06-01 08:05:45 +02:00
*
2016-04-09 19:32:05 +02:00
* @ param string $name Filename
* @ param string $type ? ? ?
* @ param string $index ? ? ?
* @ return string
2012-06-01 08:05:45 +02:00
*/
2012-06-09 13:54:05 +02:00
protected function trimFileName ( $name , $type , $index )
2012-07-02 19:30:37 +02:00
{
// Remove path information and dots around the filename, to prevent uploading
// into different directories or replacing hidden system files.
// Also remove control characters and spaces (\x00..\x20) around the filename:
$file_name = trim ( basename ( stripslashes ( $name )), " . \x00 .. \x20 " );
// Add missing file extension for known image types:
if ( strpos ( $file_name , '.' ) === false &&
preg_match ( '/^image\/(gif|jpe?g|png)/' , $type , $matches )) {
$file_name .= '.' . $matches [ 1 ];
}
2021-02-23 22:03:23 +01:00
if ( $this -> options [ 'discard_aborted_uploads' ]) {
while ( is_file ( $this -> options [ 'upload_dir' ] . $file_name )) {
2012-07-02 19:30:37 +02:00
$file_name = $this -> upcountName ( $file_name );
}
}
return $file_name ;
2012-06-01 08:05:45 +02:00
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
2016-04-09 19:42:34 +02:00
* handleFileUpload
2012-06-01 08:05:45 +02:00
*
* @ param string $uploaded_file Uploade file
* @ param string $name Name
* @ param int $size Size
* @ param string $type Type
* @ param string $error Error
* @ param string $index Index
* @ return stdClass
*/
2012-06-09 13:54:05 +02:00
protected function handleFileUpload ( $uploaded_file , $name , $size , $type , $error , $index )
2012-06-01 08:05:45 +02:00
{
$file = new stdClass ();
2012-06-09 13:54:05 +02:00
$file -> name = $this -> trimFileName ( $name , $type , $index );
2019-01-27 11:55:16 +01:00
$file -> mime = dol_mimetype ( $file -> name , '' , 2 );
2012-06-01 08:05:45 +02:00
$file -> size = intval ( $size );
$file -> type = $type ;
2021-02-23 22:03:23 +01:00
if ( $this -> validate ( $uploaded_file , $file , $error , $index ) && dol_mkdir ( $this -> options [ 'upload_dir' ]) >= 0 ) {
2012-07-02 19:30:37 +02:00
$file_path = $this -> options [ 'upload_dir' ] . $file -> name ;
$append_file = ! $this -> options [ 'discard_aborted_uploads' ] && is_file ( $file_path ) && $file -> size > filesize ( $file_path );
2012-06-01 08:05:45 +02:00
clearstatcache ();
2012-07-02 19:30:37 +02:00
if ( $uploaded_file && is_uploaded_file ( $uploaded_file )) {
// multipart/formdata uploads (POST method uploads)
2021-02-23 22:03:23 +01:00
if ( $append_file ) {
2012-07-02 19:30:37 +02:00
file_put_contents ( $file_path , fopen ( $uploaded_file , 'r' ), FILE_APPEND );
} else {
2013-03-26 17:12:00 +01:00
dol_move_uploaded_file ( $uploaded_file , $file_path , 1 , 0 , 0 , 0 , 'userfile' );
2012-07-02 19:30:37 +02:00
}
2020-05-21 15:05:19 +02:00
} else {
2012-07-02 19:30:37 +02:00
// Non-multipart uploads (PUT method support)
file_put_contents ( $file_path , fopen ( 'php://input' , 'r' ), $append_file ? FILE_APPEND : 0 );
}
2012-06-01 08:05:45 +02:00
$file_size = filesize ( $file_path );
2021-02-23 22:03:23 +01:00
if ( $file_size === $file -> size ) {
2012-07-02 19:30:37 +02:00
$file -> url = $this -> options [ 'upload_url' ] . rawurlencode ( $file -> name );
2021-02-23 22:03:23 +01:00
foreach ( $this -> options [ 'image_versions' ] as $version => $options ) {
if ( $this -> createScaledImage ( $file -> name , $options )) {
2020-04-10 10:59:32 +02:00
$tmp = explode ( '.' , $file -> name );
2012-07-02 19:30:37 +02:00
$file -> { $version . '_url' } = $options [ 'upload_url' ] . rawurlencode ( $tmp [ 0 ] . '_mini.' . $tmp [ 1 ]);
}
}
2021-02-23 22:03:23 +01:00
} elseif ( $this -> options [ 'discard_aborted_uploads' ]) {
2012-07-02 19:30:37 +02:00
unlink ( $file_path );
$file -> error = 'abort' ;
2012-06-01 08:05:45 +02:00
}
$file -> size = $file_size ;
2012-06-09 13:54:05 +02:00
$this -> setFileDeleteUrl ( $file );
2012-06-01 08:05:45 +02:00
}
return $file ;
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
* Output data
*
* @ return void
*/
public function get ()
{
$file_name = isset ( $_REQUEST [ 'file' ]) ?
basename ( stripslashes ( $_REQUEST [ 'file' ])) : null ;
2021-02-23 22:03:23 +01:00
if ( $file_name ) {
2012-06-09 13:54:05 +02:00
$info = $this -> getFileObject ( $file_name );
2020-05-21 15:05:19 +02:00
} else {
2012-06-09 13:54:05 +02:00
$info = $this -> getFileObjects ();
2012-06-01 08:05:45 +02:00
}
header ( 'Content-type: application/json' );
echo json_encode ( $info );
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
* Output data
*
* @ return void
*/
public function post ()
{
2021-02-23 22:03:23 +01:00
if ( isset ( $_REQUEST [ '_method' ]) && $_REQUEST [ '_method' ] === 'DELETE' ) {
2012-07-02 19:30:37 +02:00
return $this -> delete ();
2012-06-01 08:05:45 +02:00
}
$upload = isset ( $_FILES [ $this -> options [ 'param_name' ]]) ?
$_FILES [ $this -> options [ 'param_name' ]] : null ;
$info = array ();
2021-02-23 22:03:23 +01:00
if ( $upload && is_array ( $upload [ 'tmp_name' ])) {
2012-07-02 19:30:37 +02:00
// param_name is an array identifier like "files[]",
2012-06-01 08:05:45 +02:00
// $_FILES is a multi-dimensional array:
foreach ( $upload [ 'tmp_name' ] as $index => $value ) {
2020-10-31 14:32:18 +01:00
$info [] = $this -> handleFileUpload (
$upload [ 'tmp_name' ][ $index ],
isset ( $_SERVER [ 'HTTP_X_FILE_NAME' ]) ? $_SERVER [ 'HTTP_X_FILE_NAME' ] : $upload [ 'name' ][ $index ],
isset ( $_SERVER [ 'HTTP_X_FILE_SIZE' ]) ? $_SERVER [ 'HTTP_X_FILE_SIZE' ] : $upload [ 'size' ][ $index ],
isset ( $_SERVER [ 'HTTP_X_FILE_TYPE' ]) ? $_SERVER [ 'HTTP_X_FILE_TYPE' ] : $upload [ 'type' ][ $index ],
$upload [ 'error' ][ $index ],
$index
);
2012-06-01 08:05:45 +02:00
}
} elseif ( $upload || isset ( $_SERVER [ 'HTTP_X_FILE_NAME' ])) {
2012-07-02 19:30:37 +02:00
// param_name is a single object identifier like "file",
2012-06-01 08:05:45 +02:00
// $_FILES is a one-dimensional array:
2020-10-31 14:32:18 +01:00
$info [] = $this -> handleFileUpload (
isset ( $upload [ 'tmp_name' ]) ? $upload [ 'tmp_name' ] : null ,
isset ( $_SERVER [ 'HTTP_X_FILE_NAME' ]) ? $_SERVER [ 'HTTP_X_FILE_NAME' ] : ( isset ( $upload [ 'name' ]) ? $upload [ 'name' ] : null ),
isset ( $_SERVER [ 'HTTP_X_FILE_SIZE' ]) ? $_SERVER [ 'HTTP_X_FILE_SIZE' ] : ( isset ( $upload [ 'size' ]) ? $upload [ 'size' ] : null ),
isset ( $_SERVER [ 'HTTP_X_FILE_TYPE' ]) ? $_SERVER [ 'HTTP_X_FILE_TYPE' ] : ( isset ( $upload [ 'type' ]) ? $upload [ 'type' ] : null ),
isset ( $upload [ 'error' ]) ? $upload [ 'error' ] : null ,
0
);
2012-06-01 08:05:45 +02:00
}
header ( 'Vary: Accept' );
$json = json_encode ( $info );
2012-07-02 19:30:37 +02:00
$redirect = isset ( $_REQUEST [ 'redirect' ]) ?
stripslashes ( $_REQUEST [ 'redirect' ]) : null ;
if ( $redirect ) {
header ( 'Location: ' . sprintf ( $redirect , rawurlencode ( $json )));
return ;
2012-06-01 08:05:45 +02:00
}
if ( isset ( $_SERVER [ 'HTTP_ACCEPT' ]) &&
( strpos ( $_SERVER [ 'HTTP_ACCEPT' ], 'application/json' ) !== false )) {
header ( 'Content-type: application/json' );
} else {
header ( 'Content-type: text/plain' );
}
echo $json ;
}
2012-05-31 21:08:14 +02:00
2012-06-01 08:05:45 +02:00
/**
* Delete uploaded file
*
* @ return void
*/
public function delete ()
{
$file_name = isset ( $_REQUEST [ 'file' ]) ?
basename ( stripslashes ( $_REQUEST [ 'file' ])) : null ;
$file_path = $this -> options [ 'upload_dir' ] . $file_name ;
$success = is_file ( $file_path ) && $file_name [ 0 ] !== '.' && unlink ( $file_path );
2021-02-23 22:03:23 +01:00
if ( $success ) {
foreach ( $this -> options [ 'image_versions' ] as $version => $options ) {
2012-06-01 08:05:45 +02:00
$file = $options [ 'upload_dir' ] . $file_name ;
2021-02-23 22:03:23 +01:00
if ( is_file ( $file )) {
2012-06-01 08:05:45 +02:00
unlink ( $file );
}
}
}
header ( 'Content-type: application/json' );
echo json_encode ( $success );
}
2012-05-31 21:08:14 +02:00
}