3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
10 namespace Zend\ProgressBar\Upload
;
13 use Zend\ProgressBar\Adapter\AbstractAdapter
as AbstractProgressAdapter
;
14 use Zend\ProgressBar\Exception
;
15 use Zend\ProgressBar\ProgressBar
;
16 use Zend\Stdlib\ArrayUtils
;
19 * Abstract class for Upload Progress Handlers
21 abstract class AbstractUploadHandler
implements UploadHandlerInterface
26 protected $sessionNamespace = 'Zend\ProgressBar\Upload\AbstractUploadHandler';
29 * @var AbstractProgressAdapter|ProgressBar
31 protected $progressAdapter;
34 * @param array|Traversable $options Optional options
35 * @throws Exception\InvalidArgumentException
37 public function __construct($options = array())
39 if (!empty($options)) {
40 $this->setOptions($options);
45 * Set options for a upload handler. Accepted options are:
46 * - session_namespace: session namespace for upload progress
47 * - progress_adapter: progressbar adapter to use for updating progress
49 * @param array|Traversable $options
50 * @return AbstractUploadHandler
51 * @throws Exception\InvalidArgumentException
53 public function setOptions($options)
55 if ($options instanceof Traversable
) {
56 $options = ArrayUtils
::iteratorToArray($options);
57 } elseif (!is_array($options)) {
58 throw new Exception\
InvalidArgumentException(
59 'The options parameter must be an array or a Traversable'
63 if (isset($options['session_namespace'])) {
64 $this->setSessionNamespace($options['session_namespace']);
66 if (isset($options['progress_adapter'])) {
67 $this->setProgressAdapter($options['progress_adapter']);
74 * @param string $sessionNamespace
75 * @return AbstractUploadHandler|UploadHandlerInterface
77 public function setSessionNamespace($sessionNamespace)
79 $this->sessionNamespace
= $sessionNamespace;
86 public function getSessionNamespace()
88 return $this->sessionNamespace
;
92 * @param AbstractProgressAdapter|ProgressBar $progressAdapter
93 * @return AbstractUploadHandler|UploadHandlerInterface
95 public function setProgressAdapter($progressAdapter)
97 $this->progressAdapter
= $progressAdapter;
102 * @return AbstractProgressAdapter|ProgressBar
104 public function getProgressAdapter()
106 return $this->progressAdapter
;
113 public function getProgress($id)
119 'message' => 'No upload in progress',
126 $newStatus = $this->getUploadProgress($id);
127 if (false === $newStatus) {
130 $status = $newStatus;
131 if ('' === $status['message']) {
132 $status['message'] = $this->toByteString($status['current']) .
133 " - " . $this->toByteString($status['total']);
137 $adapter = $this->getProgressAdapter();
138 if (isset($adapter)) {
139 if ($adapter instanceof AbstractProgressAdapter
) {
140 $adapter = new ProgressBar(
141 $adapter, 0, $status['total'], $this->getSessionNamespace()
143 $this->setProgressAdapter($adapter);
146 if (!$adapter instanceof ProgressBar
) {
147 throw new Exception\
RuntimeException('Unknown Adapter type given');
150 if ($status['done']) {
153 $adapter->update($status['current'], $status['message']);
164 abstract protected function getUploadProgress($id);
167 * Returns the formatted size
172 protected function toByteString($size)
174 $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
175 for ($i=0; $size >= 1024 && $i < 9; $i++
) {
179 return round($size, 2) . $sizes[$i];