Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brhue

Classe upload

Recommended Posts

Estou continuando meus estudos sobre oop e SOLID, e queria saber se minhas classes estão violando algum principio do SOLID.

Segue a tentativa:

 

Upload.class.php

<?php 

class Upload {

	private $fileName;
	private $fileSize = 2.0;
	private $fileType;
	private $filePath;
	private $token;

	protected $userFile;

	public function __construct(Token $token) {
		$this->token= $token;
	}

	public function setFileSize($maxSize) {
		$this->fileSize = (float)$maxSize * 1024 * 1024;
	}

	public function setFileType(Array $type) {
		$this->fileType = $type;
	}

	public function setFilePath($path) {
		$this->filePath = $path;
	}

	public function setUserFile($userFile) {
		$this->userFile = $userFile;
	}

	public function getFileName() {
		if (is_null($this->fileName))
			$this->randomName();

		return $this->fileName;
	}

	public function uploadFile() {
		if (!in_array($this->getExtension(), $this->fileType)) 
			throw new RuntimeException("Extensão de arquivo não permitido.");
		else if ($this->fileSize < $_FILES[$this->userFile]['size'])
			throw new RuntimeException("Tamanho de arquivo não permitido.");
		else if (!move_uploaded_file($_FILES[$this->userFile]['tmp_name'], $this->filePath.$this->getFileName()))
			throw new RuntimeException("Falha ao mover arquivo.");	
	}

	private function randomName() {
		$this->fileName = $this->token->generateToken().'.'.$this->getExtension();
	}

	private function getExtension() {
		return pathinfo($_FILES[$this->userFile]['name'], PATHINFO_EXTENSION);
	}
}

?>

Esses sets, seria ideal colocar tudo no construtor?

 

 

Token.php

<?php 

interface Token {

	public function generateToken();
}

?>

Bin2Hex.class.php

class Bin2Hex implements Token {

	public function generateToken() {
		return bin2hex(openssl_random_pseudo_bytes(32));
	}
}

UploadImage.class.php

<?php 

class UploadImage extends Upload {

	private $height;
	private $width;

	public function setImageHeight($height) {
		$this->height = $height;
	}	

	public function setImageWidth($width) {
		$this->width = $width;
	}

	public function uploadFile() {

		list($height, $width) = getimagesize($_FILES[$this->userFile]['tmp_name']);

		if ($this->height < $height) {
			throw new RuntimeException("Altura da imagem não permitida.");
		} else if ($this->width < $width) {
			throw new RuntimeException("Largura da imagem não permitida.");
		}

		parent::uploadFile();
	}
}

->A ideia aqui seria uma classe mais especifica para imagem...

E a maior dúvida é se nessa parte viola o LSP (herança).

 

index.php

$upload = new UploadImage(new Bin2Hex());
$upload->setUserFile('photo');
$upload->setFilePath('uploads/');
$upload->setFileType(array('jpg', 'png'));
$upload->setFileSize(1.0);
$upload->setImageHeight(800);
$upload->setImageWidth(600);

try {
    $upload->uploadFile();
} catch (RuntimeException $e) {
   echo $e->getMessage();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa que eu faria seria separar a sua classe upload.

interface FileInterface{
 ... get e set dos atributos da $_FILE
}
class File implements FileInterface
{
  ... atributos da $_FILE

  .. Metodos get e set

}
class Upload{

   public function uploadFile(FileInterface $file){
      ...
   }


}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.... Agora em relação em passar os set's pelo construtor não é melhor? pois o File::setUserFile($userfile) tem que ser setado primeiro, mas ai eu penso, se eu quiser fazer varios uploads, vou ter que criar varios objetos.

 

Outra dúvida, então a antiga classe UploadImage, eu criaria apenas classe Image que extenderia File? E Qual seria a melhor maneira de fazer as consistencia, seria mesmo na classe Upload utilizando exceptions?

 

Segue a tentativa:

 

FileInterface

interface FileInterface {

	public function setFilePath($path);
	public function setFileSize($size);
	public function setFileType(Array $type);
	public function setRandomName(Token $token);
	public function getUserFile();
	public function getFilePath();
	public function getFileType();
	public function getFileSize();
	public function getFileName();
	public function getExtension();
}

File

class File implements FileInterface {

	private $fileName;
	private $filePath;
	private $fileType;
	private $fileSize = 2;

	protected $userFile;
	
	public function __construct($userFile) {
		$this->userFile = $userFile;
	}

	public function setFilePath($path) {
		$this->filePath = $path;
	}

	public function setFileType(Array $type) {
		$this->fileType = $type;
	}

	public function setFileSize($size) {
		$this->fileSize = (float)$size * 1024 * 1024;
	}

	public function setRandomName(Token $token) {
		$this->fileName = $token->generateToken().'.'.$this->getExtension();
	} 

	public function getUserFile() {
		return $this->userFile;
	}

	public function getFilePath() {
		return $this->filePath;
	}

	public function getFileType() {
		return $this->fileType;
	}

	public function getFileSize() {
		return $this->fileSize;
	}

	public function getFileName() {
		return $this->fileName;
	}

	public function getExtension() {
		return pathinfo($_FILES[$this->userFile]['name'], PATHINFO_EXTENSION);
	}

} 

Upload

class Upload {

	public function uploadFile(FileInterface $file) {

		if (!in_array($file->getExtension(), $file->getFileType())) 
			throw new RuntimeException("Extensão de arquivo não permitido.");
		else if ($file->getFileSize() < $_FILES[$file->getUserFile()]['size'])
			throw new RuntimeException("Tamanho de arquivo não permitido.");
		else if (!move_uploaded_file($_FILES[$file->getUserFile()]['tmp_name'], $file->getFilePath().$file->getFileName()))
			throw new RuntimeException("Falha ao mover arquivo.");
	}
}

testeUpload

<?php 

require_once 'autoload.php';
require_once 'display_error.php';

if (isset($_POST['submit'])) {

    $file = new File('file');
    $file->setFilePath('uploads/');
    $file->setFileType(array('jpg', 'png', 'gif'));
    $file->setFileSize(1.0);
    $file->setRandomName(new Bin2Hex());

    echo 'Teste1: '.$file->getFileName().'<br>';

    $upload = new Upload();
    $upload->uploadFile($file);

    echo 'Teste2: '.$file->getFileName().'<br>';
}

?>

<form action="testeUpload.php" method="post" enctype="multipart/form-data">

<h2>Upload File</h2>

<label for="fileSelect">Filename:</label>

<input type="file" name="file"><br>

<input type="submit" name="submit" value="Upload">

</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por AlexandreHenrique
      Olá pessoal. preciso de uma ajuda com o meu projeto de upload.
      O projeto de upload roda no IIS + Php;
      Tenho um script que ta enviando  o arquivo para o diretório correto.
      O problema é que ao tentar acessar esse arquivo via URL, o anexo não abre  e exibe a mensagem abaixo.
       

      Notei que o arquivo ao cair no DIR, ele entra sem permissões (vi em propriedades), se eu editar o mesmo alterando as permissões, ele carrega pela url do meu site.
      Quero que o arquivo enviado pelo script caia no DIR correta com as devidas permissões pra eu poder ler no navegador via URL;
       
      Já tentei resolver de toda forma mas nao tive sucesso;.
      No Apache isso é mais simples, mas no IIS ta complicado;
       
       
       
      Alguem pode me dá uma dica?
    • Por Caio Vargas
      Fala pessoa tudo tranquilo ?
      estou com um problema eu fiz um sistema de upload onde tem a marca dagua  o problema e que quando o cadastro da capa e pequena a imagem da marca dagua fica grande
      e qauando a capa e grande  a imagem da marca dagua fica pequena alguem poderia me ajudar 
    • Por mateus.andriollo
      Olá,
      Gostaria de saber se alguem pode me ajudar.
      Meu PHP esta na pasta public_html em um CPanel, quero saber se é possível armazenar em pasta fora da pasta  pública, por segurança mesmo...
      Faço isso em ASP, ai chamo a imagem por um fso, funciona mas queria saber se tem como no PHP.
    • Por DeniseAlencar
      Boar tarde pessoal estou fazendo um teste com upload de imagens gravando no banco de dados porem quando cadastro uma imagem com o nome "foto.jpg" e depois cadastro a mesma imagem com o mesmo nome, no banco de dados aparece dois registros com nomes iguais mas gostaria que os nomes fossem diferentes.
       
      E na pasta arquivos aparece uma unica imagem gostaria que quando cadastrasse fotos iguais o nome mudasse tipo foto.jpg , foto2.jpg  etc (isso automaticamente) vou postar o codigo .
      <?php $diretorio = "arquivos/"; if(!is_dir($diretorio)){ echo "Pasta $diretorio não existe";}else{ $arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE; for ($controle = 0; $controle < count($arquivo['name']); $controle++){ $destino = $diretorio."/".$arquivo['name'][$controle]; $nome_foto = $arquivo['name'][$controle]; if(move_uploaded_file($arquivo['tmp_name'][$controle], $destino)){ $sql="INSERT INTO galeria (arquivo) VALUES ('$nome_foto')"; $qry = mysqli_query($conexao,$sql); echo "<head><meta HTTP-EQUIV='refresh' CONTENT='0;URL=index.php'></head>"; }else{ echo "Erro ao realizar upload"; } } } ?>  
    • Por Sapinn
      Estou precisando salvar fotos dos usuários de um sistema e não estou conseguindo fazer com OO já assisti video aulas e li algumas matérias mas sempre dá erro. Alguém sabe algum jeito de se fazer?? Eu até tentei mas fica sempre com erro, vou postar aqui talvez tenha algo que eu esteja fazendo errado.
       
      class para salvar a foto:
         private function salvarFoto($foto){         $fotos = $_FILES['foto_admin'];         $fotoDir = "imagens/fotos_admins/";         $fotoPath = $fotoDir . basename($foto['foto_admin']['name']);         $fotoTmp = $foto['foto_admin']['tmp_name'];         if(move_uploaded_file($fotoTmp, $fotoPath)):             return $fotoPath;         else:             return false;         endif;     } E estou chamando ela assim:
       $upload = $this->salvarFoto($_FILES);                 if(gettype($upload) == 'string'):                     $dados['foto_admin'] = $upload;                 endif;  
      E o erro é o seguinte: move_uploaded_file(imagens/fotos_admins/sapinn.jpg): failed to open stream: No such file or directory in
       
      Não sei o que está errado a pasta imagens/fotos_admins está dentro da minha pasta Controller
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.