| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Upload an image via the API | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  API | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  | if (!defined('GNUSOCIAL')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Upload an image via the API.  Returns a shortened URL for the image | 
					
						
							|  |  |  |  * to the user. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category API | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class ApiMediaUploadAction extends ApiAuthAction | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |     protected $needPost = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Handle the request | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Grab the file from the 'media' param, then store, and shorten | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @todo Upload throttle! | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array $args $_REQUEST data (unused) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |     protected function handle() | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |         parent::handle(); | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Workaround for PHP returning empty $_POST and $_FILES when POST
 | 
					
						
							|  |  |  |         // length > post_max_size in php.ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($_FILES) | 
					
						
							|  |  |  |             && empty($_POST) | 
					
						
							|  |  |  |             && ($_SERVER['CONTENT_LENGTH'] > 0) | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2010-10-21 13:20:21 +02:00
										 |  |  |             // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit.
 | 
					
						
							|  |  |  |             // TRANS: %s is the number of bytes of the CONTENT_LENGTH.
 | 
					
						
							|  |  |  |             $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', | 
					
						
							|  |  |  |                       'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', | 
					
						
							|  |  |  |                       intval($_SERVER['CONTENT_LENGTH'])); | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |             $this->clientError(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |         // we could catch "NoUploadedMediaException" as "no media uploaded", but here we _always_ want an upload
 | 
					
						
							| 
									
										
										
										
											2015-01-23 14:32:39 +01:00
										 |  |  |         $upload = MediaFile::fromUpload('media', $this->scoped); | 
					
						
							| 
									
										
										
										
											2015-01-24 11:38:10 +01:00
										 |  |  |          | 
					
						
							|  |  |  |         // Thumbnails will be generated/cached on demand when accessed (such as with /attachment/:id/thumbnail)
 | 
					
						
							| 
									
										
										
										
											2015-01-23 14:52:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |         $this->showResponse($upload); | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show a Twitpic-like response with the ID of the media file | 
					
						
							|  |  |  |      * and a (hopefully) shortened URL for it. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |      * @param MediaFile $upload  the uploaded file | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-01-21 17:32:57 +01:00
										 |  |  |     function showResponse(MediaFile $upload) | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->initDocument(); | 
					
						
							|  |  |  |         $this->elementStart('rsp', array('stat' => 'ok')); | 
					
						
							|  |  |  |         $this->element('mediaid', null, $upload->fileRecord->id); | 
					
						
							|  |  |  |         $this->element('mediaurl', null, $upload->shortUrl()); | 
					
						
							|  |  |  |         $this->elementEnd('rsp'); | 
					
						
							|  |  |  |         $this->endDocument(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Overrided clientError to show a more Twitpic-like error | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param String $msg an error message | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function clientError($msg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->initDocument(); | 
					
						
							|  |  |  |         $this->elementStart('rsp', array('stat' => 'fail')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // @todo add in error code
 | 
					
						
							|  |  |  |         $errAttr = array('msg' => $msg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->element('err', $errAttr, null); | 
					
						
							|  |  |  |         $this->elementEnd('rsp'); | 
					
						
							|  |  |  |         $this->endDocument(); | 
					
						
							| 
									
										
										
										
											2015-10-10 17:12:44 +02:00
										 |  |  |         exit; | 
					
						
							| 
									
										
										
										
											2010-03-15 22:10:32 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |