/** * @param DataObject|DataObjectInterface $record */ public function saveInto(DataObjectInterface $record) { if (!isset($_FILES[$this->name])) { return; } $fileClass = File::get_class_for_file_extension(File::get_file_extension($_FILES[$this->name]['name'])); /** @var File $file */ if ($this->relationAutoSetting) { // assume that the file is connected via a has-one $objectClass = DataObject::getSchema()->hasOneComponent(get_class($record), $this->name); if ($objectClass === File::class || empty($objectClass)) { // Create object of the appropriate file class $file = Object::create($fileClass); } else { // try to create a file matching the relation $file = Object::create($objectClass); } } else { if ($record instanceof File) { $file = $record; } else { $file = Object::create($fileClass); } } $this->upload->loadIntoFile($_FILES[$this->name], $file, $this->getFolderName()); if ($this->upload->isError()) { return; } if ($this->relationAutoSetting) { if (empty($objectClass)) { return; } $file = $this->upload->getFile(); $record->{$this->name . 'ID'} = $file->ID; } }
public function testFileVersioningWithAnExistingFile() { $upload = function ($tmpFileName) { // create tmp file $tmpFilePath = TEMP_FOLDER . '/' . $tmpFileName; $tmpFileContent = ''; for ($i = 0; $i < 10000; $i++) { $tmpFileContent .= '0'; } file_put_contents($tmpFilePath, $tmpFileContent); // emulates the $_FILES array $tmpFile = array('name' => $tmpFileName, 'type' => 'text/plaintext', 'size' => filesize($tmpFilePath), 'tmp_name' => $tmpFilePath, 'extension' => 'jpg', 'error' => UPLOAD_ERR_OK); $v = new UploadTest_Validator(); // test upload into default folder $u = new Upload(); $u->setReplaceFile(false); $u->setValidator($v); $u->loadIntoFile($tmpFile); return $u->getFile(); }; // test empty file version prefix Config::inst()->update('SilverStripe\\Assets\\Storage\\DefaultAssetNameGenerator', 'version_prefix', ''); $file1 = $upload('UploadTest-IMG001.jpg'); $this->assertEquals('UploadTest-IMG001.jpg', $file1->Name, 'File does not receive new name'); $file2 = $upload('UploadTest-IMG001.jpg'); $this->assertEquals('UploadTest-IMG002.jpg', $file2->Name, 'File does receive new name'); $file3 = $upload('UploadTest-IMG002.jpg'); $this->assertEquals('UploadTest-IMG003.jpg', $file3->Name, 'File does receive new name'); $file4 = $upload('UploadTest-IMG3.jpg'); $this->assertEquals('UploadTest-IMG3.jpg', $file4->Name, 'File does not receive new name'); $file1->delete(); $file2->delete(); $file3->delete(); $file4->delete(); // test '-v' file version prefix Config::inst()->update('SilverStripe\\Assets\\Storage\\DefaultAssetNameGenerator', 'version_prefix', '-v'); $file1 = $upload('UploadTest2-IMG001.jpg'); $this->assertEquals('UploadTest2-IMG001.jpg', $file1->Name, 'File does not receive new name'); $file2 = $upload('UploadTest2-IMG001.jpg'); $this->assertEquals('UploadTest2-IMG001-v2.jpg', $file2->Name, 'File does receive new name'); $file3 = $upload('UploadTest2-IMG001.jpg'); $this->assertEquals('UploadTest2-IMG001-v3.jpg', $file3->Name, 'File does receive new name'); $file4 = $upload('UploadTest2-IMG001-v3.jpg'); $this->assertEquals('UploadTest2-IMG001-v4.jpg', $file4->Name, 'File does receive new name'); }