/**
  * @inheritDoc IFieldType::prepValueFromPost()
  *
  * @param mixed $value
  *
  * @return mixed
  */
 public function prepValueFromPost($value)
 {
     // See if we have uploaded file(s).
     $contentPostLocation = $this->getContentPostLocation();
     if ($contentPostLocation) {
         $uploadedFiles = UploadedFile::getInstancesByName($contentPostLocation);
         if (!empty($uploadedFiles)) {
             // See if we have to validate against fileKinds
             $settings = $this->getSettings();
             if (isset($settings->restrictFiles) && !empty($settings->restrictFiles) && !empty($settings->allowedKinds)) {
                 $allowedExtensions = static::_getAllowedExtensions($settings->allowedKinds);
                 $failedFiles = array();
                 foreach ($uploadedFiles as $uploadedFile) {
                     $extension = mb_strtolower(IOHelper::getExtension($uploadedFile->getName()));
                     if (!in_array($extension, $allowedExtensions)) {
                         $failedFiles[] = $uploadedFile;
                     }
                 }
                 // If any files failed the validation, make a note of it.
                 if (!empty($failedFiles)) {
                     $this->_failedFiles = $failedFiles;
                     return true;
                 }
             }
             // If we got here either there are no restrictions or all files are valid so let's turn them into Assets
             $fileIds = array();
             $targetFolderId = $this->_determineUploadFolderId($settings);
             if (!empty($targetFolderId)) {
                 foreach ($uploadedFiles as $file) {
                     $tempPath = AssetsHelper::getTempFilePath($file->getName());
                     move_uploaded_file($file->getTempName(), $tempPath);
                     $response = craft()->assets->insertFileByLocalPath($tempPath, $file->getName(), $targetFolderId);
                     $fileIds[] = $response->getDataItem('fileId');
                     IOHelper::deleteFile($tempPath, true);
                 }
                 if (is_array($value) && is_array($fileIds)) {
                     $fileIds = array_merge($value, $fileIds);
                 }
                 // Make it look like the actual POST data contained these file IDs as well,
                 // so they make it into entry draft/version data
                 $this->element->setRawPostContent($this->model->handle, $fileIds);
                 return $fileIds;
             }
         }
     }
     return parent::prepValueFromPost($value);
 }
 /**
  * @inheritDoc IFieldType::prepValueFromPost()
  *
  * @param mixed $value
  *
  * @return mixed
  */
 public function prepValueFromPost($value)
 {
     $dataFiles = array();
     // Grab data strings
     if (isset($value['data']) && is_array($value['data'])) {
         foreach ($value['data'] as $index => $dataString) {
             if (preg_match('/^data:(?<type>[a-z0-9]+\\/[a-z0-9]+);base64,(?<data>.+)/i', $dataString, $matches)) {
                 $type = $matches['type'];
                 $data = base64_decode($matches['data']);
                 if (!$data) {
                     continue;
                 }
                 if (!empty($value['filenames'][$index])) {
                     $filename = $value['filenames'][$index];
                 } else {
                     $extension = FileHelper::getExtensionByMimeType($type);
                     $filename = 'Uploaded file.' . $extension;
                 }
                 $dataFiles[] = array('filename' => $filename, 'data' => $data);
             }
         }
     }
     // Remove these so they don't interfere.
     if (isset($value['data']) && isset($value['filenames'])) {
         unset($value['data'], $value['filenames']);
     }
     $uploadedFiles = array();
     // See if we have uploaded file(s).
     $contentPostLocation = $this->getContentPostLocation();
     if ($contentPostLocation) {
         $files = UploadedFile::getInstancesByName($contentPostLocation);
         foreach ($files as $file) {
             $uploadedFiles[] = array('filename' => $file->getName(), 'location' => $file->getTempName());
         }
     }
     // See if we have to validate against fileKinds
     $settings = $this->getSettings();
     $allowedExtensions = false;
     if (isset($settings->restrictFiles) && !empty($settings->restrictFiles) && !empty($settings->allowedKinds)) {
         $allowedExtensions = static::_getAllowedExtensions($settings->allowedKinds);
     }
     if (is_array($allowedExtensions)) {
         foreach ($dataFiles as $file) {
             $extension = StringHelper::toLowerCase(IOHelper::getExtension($file['filename']));
             if (!in_array($extension, $allowedExtensions)) {
                 $this->_failedFiles[] = $file['filename'];
             }
         }
         foreach ($uploadedFiles as $file) {
             $extension = StringHelper::toLowerCase(IOHelper::getExtension($file['filename']));
             if (!in_array($extension, $allowedExtensions)) {
                 $this->_failedFiles[] = $file['filename'];
             }
         }
     }
     if (!empty($this->_failedFiles)) {
         return true;
     }
     // If we got here either there are no restrictions or all files are valid so let's turn them into Assets
     $fileIds = array();
     $targetFolderId = $this->_determineUploadFolderId($settings);
     if (!empty($targetFolderId)) {
         foreach ($dataFiles as $file) {
             $tempPath = AssetsHelper::getTempFilePath($file['filename']);
             IOHelper::writeToFile($tempPath, $file['data']);
             $response = craft()->assets->insertFileByLocalPath($tempPath, $file['filename'], $targetFolderId);
             $fileIds[] = $response->getDataItem('fileId');
             IOHelper::deleteFile($tempPath, true);
         }
         foreach ($uploadedFiles as $file) {
             $tempPath = AssetsHelper::getTempFilePath($file['filename']);
             move_uploaded_file($file['location'], $tempPath);
             $response = craft()->assets->insertFileByLocalPath($tempPath, $file['filename'], $targetFolderId);
             $fileIds[] = $response->getDataItem('fileId');
             IOHelper::deleteFile($tempPath, true);
         }
         if (is_array($value) && is_array($fileIds)) {
             $fileIds = array_merge($value, $fileIds);
         }
         // Make it look like the actual POST data contained these file IDs as well,
         // so they make it into entry draft/version data
         $this->element->setRawPostContent($this->model->handle, $fileIds);
         return $fileIds;
     }
     return parent::prepValueFromPost($value);
 }