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 First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • 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"; } } } ?>  
×

Informação importante

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