Merge pull request #5207 from owncloud/fixing-4011-part2-master

[OC6] file upload exception handling
This commit is contained in:
Thomas Müller 2013-10-11 10:35:17 -07:00
commit dc58195c7f
8 changed files with 121 additions and 25 deletions

View File

@ -110,30 +110,35 @@ if (strpos($dir, '..') === false) {
|| (isset($_POST['resolution']) && $_POST['resolution']==='replace')
) {
// upload and overwrite file
if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
// updated max file size after upload
$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
$meta = \OC\Files\Filesystem::getFileInfo($target);
if ($meta === false) {
$error = $l->t('Upload failed. Could not get file info.');
try
{
if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
// updated max file size after upload
$storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir);
$meta = \OC\Files\Filesystem::getFileInfo($target);
if ($meta === false) {
$error = $l->t('Upload failed. Could not get file info.');
} else {
$result[] = array('status' => 'success',
'mime' => $meta['mimetype'],
'mtime' => $meta['mtime'],
'size' => $meta['size'],
'id' => $meta['fileid'],
'name' => basename($target),
'originalname' => $files['tmp_name'][$i],
'uploadMaxFilesize' => $maxUploadFileSize,
'maxHumanFilesize' => $maxHumanFileSize,
'permissions' => $meta['permissions'],
);
}
} else {
$result[] = array('status' => 'success',
'mime' => $meta['mimetype'],
'mtime' => $meta['mtime'],
'size' => $meta['size'],
'id' => $meta['fileid'],
'name' => basename($target),
'originalname' => $files['tmp_name'][$i],
'uploadMaxFilesize' => $maxUploadFileSize,
'maxHumanFilesize' => $maxHumanFileSize,
'permissions' => $meta['permissions'],
);
$error = $l->t('Upload failed. Could not find uploaded file');
}
} else {
$error = $l->t('Upload failed. Could not find uploaded file');
} catch(Exception $ex) {
$error = $ex->getMessage();
}
} else {
@ -164,5 +169,5 @@ if ($error === false) {
OCP\JSON::encodedPrint($result);
exit();
} else {
OCP\JSON::error(array('data' => array_merge(array('message' => $error), $storageStats)));
OCP\JSON::error(array(array('data' => array_merge(array('message' => $error), $storageStats))));
}

View File

@ -345,7 +345,7 @@ $(document).ready(function() {
} else if (result[0].status !== 'success') {
//delete data.jqXHR;
data.textStatus = 'servererror';
data.errorThrown = result.data.message; // error message has been translated on server
data.errorThrown = result[0].data.message; // error message has been translated on server
var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload');
fu._trigger('fail', e, data);
}

View File

@ -0,0 +1,22 @@
<?php
/**
* Entity Too Large
*
* This exception is thrown whenever a user tries to upload a file which exceeds hard limitations
*
*/
class OC_Connector_Sabre_Exception_EntityTooLarge extends Sabre_DAV_Exception {
/**
* Returns the HTTP status code for this exception
*
* @return int
*/
public function getHTTPCode() {
return 413;
}
}

View File

@ -0,0 +1,22 @@
<?php
/**
* Unsupported Media Type
*
* This exception is thrown whenever a user tries to upload a file which holds content which is not allowed
*
*/
class OC_Connector_Sabre_Exception_UnsupportedMediaType extends Sabre_DAV_Exception {
/**
* Returns the HTTP status code for this exception
*
* @return int
*/
public function getHTTPCode() {
return 415;
}
}

View File

@ -98,7 +98,21 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
throw new Sabre_DAV_Exception();
}
} catch (\OCP\Files\NotPermittedException $e) {
throw new Sabre_DAV_Exception_Forbidden();
// a more general case - due to whatever reason the content could not be written
throw new Sabre_DAV_Exception_Forbidden($e->getMessage());
} catch (\OCP\Files\EntityTooLargeException $e) {
// the file is too big to be stored
throw new OC_Connector_Sabre_Exception_EntityTooLarge($e->getMessage());
} catch (\OCP\Files\InvalidContentException $e) {
// the file content is not permitted
throw new OC_Connector_Sabre_Exception_UnsupportedMediaType($e->getMessage());
} catch (\OCP\Files\InvalidPathException $e) {
// the path for the file was not valid
// TODO: find proper http status code for this case
throw new Sabre_DAV_Exception_Forbidden($e->getMessage());
}
// rename to correct path

View File

@ -0,0 +1,11 @@
<?php
/**
* Copyright (c) 2013 Thomas Müller <thomas.mueller@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files;
class EntityTooLargeException extends \Exception {}

View File

@ -0,0 +1,11 @@
<?php
/**
* Copyright (c) 2013 Thomas Müller <thomas.mueller@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files;
class InvalidContentException extends \Exception {}

View File

@ -0,0 +1,11 @@
<?php
/**
* Copyright (c) 2013 Thomas Müller <thomas.mueller@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCP\Files;
class InvalidPathException extends \Exception {}