- Модуль: webdav
- Путь к файлу: ~/bitrix/modules/webdav/classes/diskdispatcher.php
- Класс: CWebDavDiskDispatcher
- Вызов: CWebDavDiskDispatcher::processActionUpload
public function processActionUpload(array $params)
{
$storage = $this->getStorageObject();
if($this->getDesktopDiskVersion() > 0)
{
$this->checkRequiredParams($params, array('name'));
$filename = $params['name'];
}
if(
$storage::compareVersion(
$_SERVER['CONTENT_LENGTH'],
(string)min(CUtil::unformat(ini_get('upload_max_filesize')), CUtil::unformat(ini_get('post_max_size')))) > 0
)
{
return $this->sendResponse(array('status' => static::STATUS_TOO_BIG));
}
if(empty($_FILES['file']) || !is_array($_FILES['file']))
{
throw new Exception('Please load file!');
}
list($startRange, $endRange, $fileSize) = $this->getContentRange();
if($startRange !== null)
{
if( ($endRange - $startRange + 1) != $_FILES['file']['size'] )
{
return $this->sendResponse(array(
'status' => static::STATUS_CHUNK_ERROR,
'message'=> 'Size of file: ' . $_FILES['file']['size'] . ' not equals size of chunk: ' . ($endRange - $startRange + 1) . '',
));
}
if($startRange == 0)
{
//attempt to decide: cloud? not cloud?
$bucket = $this->findBucketForFile(array(
'name' => $filename,
'fileSize' => $fileSize,
));
if($bucket !== false)
{
$tmpFile = CWebDavTmpFile::buildFromDownloaded($_FILES['file']);
list($tmpFile->width, $tmpFile->height) = CFile::getImageSize($tmpFile->getAbsolutePath());
$newFile = clone $tmpFile;
$newFile->filename = $filename;
$newFile->isCloud = true;
$newFile->bucketId = $bucket->ID;
$newFile->append($tmpFile, compact(
'startRange', 'endRange', 'fileSize'
));
if(!$newFile->save())
{
throw new Exception('Error in DB');
}
}
else
{
//simple upload
$newFile = $this->createNewFile();
}
return $this->sendSuccess(array(
'token' => $newFile->name,
));
}
else
{
//if run resumable upload we needed token.
$this->checkRequiredParams($params, array('token'));
if(!($tmpResumableFile = CWebDavTmpFile::buildByName($params['token'])))
{
return $this->sendResponse(array(
'status' => static::STATUS_CHUNK_ERROR,
'message'=> 'Not found file by token',
));
}
$success = $tmpResumableFile->append(CWebDavTmpFile::buildFromDownloaded($_FILES['file']), compact(
'startRange', 'endRange', 'fileSize'
));
if($success)
{
return $this->sendSuccess(array(
'token' => $tmpResumableFile->name,
));
}
}
}
else
{
//simple upload
$newFile = $this->createNewFile();
return $this->sendSuccess(array(
'token' => $newFile->name,
));
}
}