Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala galera!
Estou com um sistema onde o usuário faz upload de um arquivo .zip, dentro deste arquivo terá algumas imagens onde terei que descompactar no servidor e redimensionar as imagens.
Montei a parte do upload, recebo o arquivo e descompacto em uma pasta específica, o problema é: redimensionar as imagens após isso.
Alguém tem um sugestão?
Vou postar parte do fonte.
$zip = new ZipArchive();
if( $zip->open($local) === true){
for ($i = 0; $i < $zip->numFiles; $i++) {
$extension_zip = strchr($zip->getNameIndex($i), ".");
$file_zip = sha1($zip->getNameIndex($i)) . $extension_zip;
$zip->renameName($zip->getNameIndex($i), $file_zip);
$insert = mysql_query("INSERT INTO PROJECT (NM_PROJECT,DS_PROJECT,NM_PHOTO,NM_ZIP_ORIGINAL,NM_ZIP,USER_ID,FOLDER_ID,DT_ACTIVE)
VALUES ('$project','$description','$file_zip','$archive','$file_archive',$user_id,$folder_id,'$date')") or die("Erro: " . mysql_error());
$update = mysql_query("UPDATE FOLDER SET SOURCE = '$souce_folder', FL_ACTIVE = 1 WHERE FOLDER_ID = $folder_id") or die("Erro: " . mysql_error());
}
$zip->close();
}
$zipOpen = new ZipArchive();
if( $zipOpen->open($local) === true){
$zipOpen->extractTo('../assets/upload/client/' . $name_folder . "/" . $souce_folder);
$zipOpen->close();
}eu estou usando uma, porém onde eu uso é após submeter a imagem, ai fica BEM mais fácil.
Meu problema está em redimensionar após descompactar no servidor.
Você disse que descompacta o arquivo e coloca as imagens em um diretório específico, então você precisa varrer este diretório e ir redimensionando imagem por imagem.
Para varrer o diretório você pode usar a SPL DirectoryIterator ou a função scandir.
Eu estou tentando com o scandir, porém ele só da resize na primeira imagem... ele não faz no restante.
$dir = "assets/upload/client/cna/20-08-2013-12-28-30/";
$item = scandir($dir);
$count = count($item);
for($i=0; $i < $count; $i++){
if($item[$i] != '.' && $item[$i] != '..' && $item[$i] != '.DS_Store'){
$resizeProfile = new resize("assets/upload/client/cna/20-08-2013-12-28-30/" . $item[$i]);
$resizeProfile -> resizeImage(107, 107, 'crop');
$resizeProfile -> saveImage("assets/upload/client/cna/20-08-2013-12-28-30/thumb-" . $item[$i], 100);
}
}Ocorre algum erro (erro de timeout por exemplo) ou nada?
nada....
Estranho, eu testei o seu loop aqui com um diretório local e funcionou.
Tente usar o caminho absoluto até o diretório e faça uma verificação pra ver se é possível escrever no diretório.
$dir = __DIR__ . '/assets/upload/client/cna/20-08-2013-12-28-30';
if (!is_writable($dir)) {
exit('Não é possível escrever no diretório "' . $dir . '".');
}
$files = scandir($dir);
foreach ($files as $file) {
if (in_array($file, array('.', '..', '.DS_Store'))) {
continue;
}
$resize = new resize($dir . '/' . $file);
$resize->resizeImage(107, 107, 'crop');
$resize->saveImage($dir . '/thumb-' . $file, 100);
}
No início do script coloque isto para habilitar as mensagens de erro do PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);
E coloque isto para evitar timeout no script:
set_time_limit(0);
O estranho é que ele lista, porém se eu mandar dar o resize, ele só faz no primeiro índice...
Tinha um errinho ali no meu if, eu tinha esquecido de colocar o ponto de exclamação. Eu editei e corrigi o último post.
if (!is_writable($dir)) {
poderia ser a minha classe do resize?
Sim, se você testou o loop e está listando corretamente os arquivos e é possível escrever no diretório, é bem provável que o problema esteja nesta classe.
Você tentou usar o caminho absoluto e ativar as mensagens de erro?
se eu utilizar absoluto ele da erro, não encontra o diretório.
estou achando que é a classe porque eu listo o diretório, porém ele da resize apenas no primeiro índice.
eu estou utilizando a classe ResizeImage, tem alguma referência para eu testar?
Não deveria dar erro ao usar o caminho absoluto e ele é melhor pra evitar erros.
Você pode tentar aquela outra biblioteca que eu indiquei no post #2.
testei com sua lib...
olha isso:
Fatal error: Uncaught exception 'WideImage_UnknownImageOperationException' with message 'Can't load 'Resize' operation.' in /Users/will/Sites/4V/lib/OperationFactory.php:51 Stack trace: #0 /Users/will/Sites/4V/lib/Image.php(443): WideImage_OperationFactory::get('Resize') #1 /Users/will/Sites/4V/lib/Image.php(489): WideImage_Image->getOperation('Resize') #2 /Users/will/Sites/4V/dir.php(15): WideImage_Image->resize(400, 300) #3 {main} thrown in /Users/will/Sites/4V/lib/OperationFactory.php on line 51
é, o problema não é na classe... eu mudei e mesmo assim só deu resize no primeiro índice.
alguma idéia?
Eu testei o seu loop e depois montei outro código pra você e os dois funcionaram pra listagem dos arquivos.
Mostre como está todo o seu código pra eu ver se consigo identificar algum erro nele.
Eu fiz um teste no servidor, com imagens acima de de 1mb, não consigo dar o resize. Os testes que fiz foram com imagens de no máximo 200kb, ai deu tudo certo.
Meu problema está agora no tamanho das imagens, já que o resize funciona.
Sugestão, use o ImageMagick
@braços
Será que com ele conseguiria resolver meus problemas com os tamanhos das imagens?
Olha, utilizo ele para arquivos bem maiores e não tenho problemas.
Só verifique a questão de tamanho máximo de upload que sua hospedagem aceita.
Recomendo que use uma biblioteca pronta para tratamento de imagens, como por exemplo a WideImage.