I thought that I would add some server-side php code for this answer for all newbies who read this post and are trying to figure out how to get the file on the server side and save the file on the file system.
I understand that this answer does not directly answer the OP question, but since Brandon's answer is enough to boot an iOS device, he mentions that some php knowledge is needed, I thought I would fill in the php space with this answer.
Here is a class that I put along with some sample usage code. Please note that the files are stored in directories, on the basis of which the user downloads them. This may or may not be applicable to your use, but I thought I would leave it in place just in case.
<?php class upload { protected $user; protected $isImage; protected $isMovie; protected $file; protected $uploadFilename; protected $uploadDirectory; protected $fileSize; protected $fileTmpName; protected $fileType; protected $fileExtension; protected $saveFilePath; protected $allowedExtensions; function __construct($file, $userPointer) { // set the file we're uploading $this->file = $file; // if this is tied to a user, link the user account here $this->user = $userPointer; // set default bool values to false since we don't know what file type is being uploaded yet $this->isImage = FALSE; $this->isMovie = FALSE; // setup file properties if (isset($this->file) && !empty($this->file)) { $this->uploadFilename = $this->file['file']['name']; $this->fileSize = $this->file['file']['size']; $this->fileTmpName = $this->file['file']['tmp_name']; $this->fileType = $this->file['file']['type']; } else { throw new Exception('Received empty data. No file found to upload.'); } // get the file extension of the file we're trying to upload $tmp = explode('.', $this->uploadFilename); $this->fileExtension = strtolower(end($tmp)); } public function image($postParams) { // set default error alert (or whatever you want to return if error) $retVal = array('alert' => '115'); // set our bool $this->isImage = TRUE; // set our type limits $this->allowedExtensions = array("png"); // setup destination directory path (without filename yet) $this->uploadDirectory = DIR_IMG_UPLOADS.$this->user->uid."/photos/"; // if user is not subscribed they are allowed only one image, clear their folder here if ($this->user->isSubscribed() == FALSE) { $this->clearFolder($this->uploadDirectory); } // try to upload the file $success = $this->startUpload(); if ($success === TRUE) { // return the image name (NOTE: this wipes the error alert set above) $retVal = array( 'imageName' => $this->uploadFilename, ); } return $retVal; } public function movie($data) { // update php settings to handle larger uploads set_time_limit(300); // you may need to increase allowed filesize as well if your server is not set with a high enough limit // set default return value (error code for upload failed) $retVal = array('alert' => '92'); // set our bool $this->isMovie = TRUE; // set our allowed movie types $this->allowedExtensions = array("mov", "mp4", "mpv", "3gp"); // setup destination path $this->uploadDirectory = DIR_IMG_UPLOADS.$this->user->uid."/movies/"; // only upload the movie if the user is a subscriber if ($this->user->isSubscribed()) { // try to upload the file $success = $this->startUpload(); if ($success === TRUE) { // file uploaded so set the new retval $retVal = array('movieName' => $this->uploadFilename); } } else { // return an error code so user knows this is a limited access feature $retVal = array('alert' => '13'); } return $retVal; } //------------------------------------------------------------------------------- // Upload Process Methods //------------------------------------------------------------------------------- private function startUpload() { // see if there are any errors $this->checkForUploadErrors(); // validate the type received is correct $this->checkFileExtension(); // check the filesize $this->checkFileSize(); // create the directory for the user if it does not exist $this->createUserDirectoryIfNotExists(); // generate a local file name $this->createLocalFileName(); // verify that the file is an uploaded file $this->verifyIsUploadedFile(); // save the image to the appropriate folder $success = $this->saveFileToDisk(); // return TRUE/FALSE return $success; } private function checkForUploadErrors() { if ($this->file['file']['error'] != 0) { throw new Exception($this->file['file']['error']); } } private function checkFileExtension() { if ($this->isImage) { // check if we are in fact uploading a png image, if not return error if (!(in_array($this->fileExtension, $this->allowedExtensions)) || $this->fileType != 'image/png' || exif_imagetype($this->fileTmpName) != IMAGETYPE_PNG) { throw new Exception('Unsupported image type. The image must be of type png.'); } } else if ($this->isMovie) { // check if we are in fact uploading an accepted movie type if (!(in_array($this->fileExtension, $this->allowedExtensions)) || $this->fileType != 'video/mov') { throw new Exception('Unsupported movie type. Accepted movie types are .mov, .mp4, .mpv, or .3gp'); } } } private function checkFileSize() { if ($this->isImage) { if($this->fileSize > TenMB) { throw new Exception('The image filesize must be under 10MB.'); } } else if ($this->isMovie) { if($this->fileSize > TwentyFiveMB) { throw new Exception('The movie filesize must be under 25MB.'); } } } private function createUserDirectoryIfNotExists() { if (!file_exists($this->uploadDirectory)) { mkdir($this->uploadDirectory, 0755, true); } else { if ($this->isMovie) { // clear any prior uploads from the directory (only one movie file per user) $this->clearFolder($this->uploadDirectory); } } } private function createLocalFileName() { $now = time(); // try to create a unique filename for this users file while(file_exists($this->uploadFilename = $now.'-'.$this->uid.'.'.$this->fileExtension)) { $now++; } // create our full file save path $this->saveFilePath = $this->uploadDirectory.$this->uploadFilename; } private function clearFolder($path) { if(is_file($path)) { // if there already a file with this name clear it first return @unlink($path); } elseif(is_dir($path)) { // if it a directory, clear it contents $scan = glob(rtrim($path,'/').'/*'); foreach($scan as $index=>$npath) { $this->clearFolder($npath); @rmdir($npath); } } } private function verifyIsUploadedFile() { if (! is_uploaded_file($this->file['file']['tmp_name'])) { throw new Exception('The file failed to upload.'); } } private function saveFileToDisk() { if (move_uploaded_file($this->file['file']['tmp_name'], $this->saveFilePath)) { return TRUE; } throw new Exception('File failed to upload. Please retry.'); } } ?>
Here is a sample code demonstrating how you can use the load class ...
// get a reference to your user object if applicable $myUser = $this->someMethodThatFetchesUserWithId($myUserId); // get reference to file to upload $myFile = isset($_FILES) ? $_FILES : NULL; // use try catch to return an error for any exceptions thrown in the upload script try { // create and setup upload class $upload = new upload($myFile, $myUser); // trigger file upload $data = $upload->image(); // if uploading an image $data = $upload->movie(); // if uploading movie // return any status messages as json string echo json_encode($data); } catch (Exception $exception) { $retData = array( 'status' => 'FALSE', 'payload' => array( 'errorMsg' => $exception->getMessage() ), ); echo json_encode($retData); }
digitalHound Mar 15 '16 at 20:39 2016-03-15 20:39
source share