Upload de arquivos com mais de 50mb - PHP e JAVA(Applet)

Categoria - Desenvolvimento, Java, PHP - Por - Alessandro Rocha No Comments »

Olá

Hoje vou dar uma dica interessante para quem está precisando de um sistema para upload de arquivos relativamente grande.

O sistema chama-se Net2Ftp e permite o gerênciamento completo dos arquivos do servidor através de uma conta FTP.

Existem 3 formas de upload de arquivos:

  1. Utilizando o JAVA Upload, que é um miniaplicativo applet, que faz a transferência utilizando protocolo FTP.
  2. Utilizando Flash Upload, que é o upload feito em flash e exibe o progresso do upload em porcentagem.
  3. Utilizando o PHP, porém possui uma certa restrição de tamanho de envio, pelo fato de utilizar o protocolo HTTP, e depender de diversos fatores da rede para uma boa performance.

Neste caso, o grande diferencial é o upload usando o JAVA upload. Mas antes disso, devemos configurar o php.ini para aceitar tais configurações e o arquivo chamado settings.inc.php, localizado no diretório raiz da aplicação

$net2ftp_settings["max_filesize"] = "50000000"; // in Bytes, default 50 MB - Altere para um valor maior

Muitos provedores permitem que seja sobrescrito as configurações do arquivo php.ini da hospedagem, isso em caso de utilização de serviços de terceiros, porém caso possua sua propria estrutura de hospedagem, você pode alterar no arquivo “principal” do PHP.
Neste exemplo, alterei para valores bem altos, para não haver problemas.

max_execution_time = 9999999; Maximum execution time of each script, in seconds
 
max_input_time = 999; Maximum amount of time each script may spend parsing request data
 
memory_limit = 400MB; Maximum amount of memory a script may consume (10MB)

Mais abaixo

file_uploads = On
 
..
 
post_max_size = 250M
 
..
 
upload_max_filesize = 250M

Na verdade, o tamanho de arquivo permitido para upload pode ser bem maior que isso, porém testei apenas com arquivos de 50MB. Teoricamente não deve haver restrição para upload maior, a não ser que haja alguma restrição de tamanho no serviço contratado.

Até [ ]’ss

Adicione ->del.icio.us | Reddit | Slashdot | Digg | Facebook | Technorati | Google | StumbleUpon | Windows Live | Tailrank | Furl | Netscape | Yahoo | BlinkList

GoogleMaps + CEP

Categoria - Javascript, PHP, Webservices - Por - Alessandro Rocha No Comments »

Simples tutorial, mostrando como criar um Mashup usando o serviço de mapas do Google e um webservice de CEP com a linguagem PHP.

O funcionamento é simples. Consiste na requisição do logradouro passando o CEP como parâmetro para o serviço. A resposta então será enviada diretamente para o serviço de mapas, que através do logradouro informado, irá procurar as coordenadas geograficas e exibirá o ponto no mapa.

Adicionalmente será exibido o ponto exato do CEP pesquisado, através da figura padrão do “balão” do GoogleMaps.
Primeiramente, vamos adquirir a bibliotea NuSoap. Ela será utilizada para facilitar a requisição do endereço ao webservice.
Em seguida iremos baixar a biblioteca JSON, que irá serializar a resposta e retornar como um objeto JavaScript. Também iremos utilizar a biblioteca Prototype, para fazer as chamadas assincronas ao servidor.
Crie um arquivo php e coloque o seguinte código, explicarei em sequência.

<?php
/**
 * Essa é a parte cliente do webservice ( consumo )
 * Faz a consulta em um serviço de cep e retorna em notação JSON
 *
 */
//Define que o retorno será em javascript
header( "Content-type: text/javascript" );
 
// Inclue nossas bibliotecas
require_once("json.php");
require_once( "lib/nusoap.php" );
 
//Instancia um objeto Services_JSON
$json = new Services_JSON();
 
$res = array();
 
# Esse é o endereço do serviço
# Para você criar um webservice, necessariamente
# você precisar criar o WSDL, que nada mais eh do
# que um XML que explica como o serviço ira funcionar
#( Descrição dos métodos, tipos de dados, etc )
$wsdl = "http://www.byjg.com.br/xmlnuke-php/
		webservice.php/ws/cep?WSDL";
 
# Cria uma instancia do cliente
$client = new soapclient($wsdl,true);
 
//$client->useHTTPPersistentConnection();
 
# Se algo ocorrer errado, irá retornar um erro
# com a chamada desse metodo
$err = $client->getError();
if ($err)
{
    echo "<strong>Erro</strong> ao tentar 
	conectar-se ao Web Service: {$err}";
    exit();
}
 
# Recupera o CEP para passar como parametro para o serviço
# Poderia ser $cep_recuperado = 81000000;
# Neste caso iremos recuperar do formulario.
$cep_recuperado = ( string )$_GET["cep"];
 
# Aqui ele chama o método remoto, o primeiro
# parametro e o nome do metodo
# O segundo eh o paramentro que você vai
# passar para o método, nesse caso o cep
# A variavel $return ira conter o nome da
# rua referente à aquele cep informado
$return = $client->call( "obterLogradouro",array($cep_recuperado) );
 
## Pronto !. O cliente está feito.
?>

Agora veremos a parte de javascript, que ira requisitar a página criada

<!-- Importa a biblioteca prototype -->
<script src="prototype.js" type="text/javascript"></script>
 
<!-- Inclue a biblioteca do maps. É preciso informar sua api key, que pode ser
conseguida na própria página http://code.google.com/apis/maps/-->
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=SUAAPIKEY">
        type="text/javascript"></script>
<script src="http://www.google.com/jsapi?key=SUAAPIKEY">
type="text/javascript"></script>
<script src="http://gmaps-utility-library.googlecode.com/svn/
trunk/markermanager/release/src/markermanager.js"></script>
<script language="Javascript" type="text/javascript">
 
// Esta função é chamada ao informar o cep pelo
// formulario no final dos códigos
function ajaxRequest()
{
    $("ajaxResultDiv").innerHTML = "carregando...";
 
    // Vamos enviar o processamento para a página 
    //PHP que foi criada anteriormente
    var url = "j.php";
 
    // Recuperando o CEP do formulário
    var pars = "cep="+("cepd");
 
    // Fazendo a chamada assincrona para o servidor,
    // e ao completar o processo
    // chamaremos a função "initilize"
    var myAjax = new Ajax.Request(
    url,
    {
        method: "get",
        parameters: pars,
        onComplete:initialize
    });
}
function initialize(data)
{
    // Aqui é recuperado a resposta do servidor no formato JSON
    // Trabalhamos com JSON como objeto e não como vetor
    var jsonObject = eval("(" + data.responseText + ")");
 
    var cep = jsonObject.ceps;
    var html = "";
 
    // Renderiza o mapa
    if (GBrowserIsCompatible())
    {
        var map = new GMap2($("ajaxResultDiv"));
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(-25.429722, -49.271944), 13);
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
 
        // Aqui eu irei passar o logradouro recuperado
        // para exibição no mapa
        var addr = cep.Logradouro;
        var geocoder = new GClientGeocoder;
        geocoder.getLatLng( addr,function (point)    
        // <-- chamo a inner function "point"
        { if (!point)
        {
            $("ajaxResultDiv").innerHTML 
            = $("cepd").value+" nao encontrado";
        } else {
            var marker = new GMarker(point, {draggable: true});
            map.addOverlay(marker);
            map.setCenter(point,15 );
            $("searchcontrol").style.display="block";
        }});
    }
}
// Caso o logradouro seja encontrado, 
// será exibido o ponto no mapa
function (point)
{
    if (!point)
    {
        $("ajaxResultDiv").innerHTML = point+" nao encontrado";
    }
    else
    {
        var marker = new GMarker(point, {draggable: true});
        var map = new GMap2($("ajaxResultDiv"));
        map.addOverlay(marker);
    }
}
</script>
<p id="searchcontrol" style="display: none">carregando...</ p>
<fieldset>
<legend>Digite o CEP :</legend>
<input id="cepd" type="text" />
<input value="JSON" name="click" type="button" 
onclick="javascript:ajaxRequest();" >
</fieldset>

mapa.PNG

Para saber mais sobre a biblioteca Prototype.js, que foi utilizada no exemplo visite a documentação oficial AQUI

Uma otima referência em português sobre Google Maps podem ser encontradas no “Curso de GoogleMaps” do Bruno Campagnolo de Paula neste endereço -
http://www.brunocampagnolo.com/googlemaps/

Adicione ->del.icio.us | Reddit | Slashdot | Digg | Facebook | Technorati | Google | StumbleUpon | Windows Live | Tailrank | Furl | Netscape | Yahoo | BlinkList

Número de parametros dinâmicos em funções (PHP)

Categoria - Desenvolvimento, PHP - Por - Alessandro Rocha No Comments »

Ao escrever uma função em PHP, muitas vezes nos deparamos com a necessidade de passar uma longa lista de parametros para ela.

Exemplo

function minhaFuncao( $param1,$param2,$param3,$param4,
                      $param5,$param6,$param7,$param8 )
{
	if( $param1 != "" )
	{
		print $param1;
	}
	elseif ( $param1 != "" && $param2 != "" )
	{
		print $param1.$param2;
	}
	elseif ( $param1 != "" && $param2 != "" && $param3 != "" )
	{
	print $param1.$param2.$param3;
	}
	//...
	// E assim sucessivamente, seguinda essa logica
}
 
minhaFuncao( "qosmiotech ","tecnologia ","e ","cotidiano ",
"artigos ","e ","dicas ","de informatica" );
 
// Ira imprimir "qosmiotech tecnologia e
//cotidiano artigos e dicas de informatica"
? >

Isso além de ficar esteticamente “feio”, pode confundir o programador na passagem dos parametros.
Além disso,caso e eu precise passar apenas o 8º parametro ( “de informatica” )
para exibir na tela, então preciso passar os 7 parametros anteriores com valor nulo.

minhaFuncao( "","","","","","","",$param8 );
 
// Ira imprimi "de informatica";

Para isso, o PHP fornece algumas funções nativas para otimizar isso,
como func_num_args(),func_ get_ arg() e func_ get_ args().

func_num_args() retorna a quantidade de parametros de determinada função.Necessariamente
ela precisa estar sendo chamada dentro de uma função definida pelo usuário.

Exemplo

function minhaFuncao()
{
	if( func_num_args() == 0 )
	die( "Necessario pelo menos 1 parametro" );
	else
	print "Existem ".func_num_args()." parametros";
}
 
minhaFuncao();
// Irá imprimir "Necessario pelo menos 1 parametro"
 
minhaFuncao( 1,2,3,4,5,6,7,8,9,10 );
// Irá imprimir "Existem 10 parametros"

Para recuperar um valor passado para a função, então uso func_get_arg(), passando como parametro o número do argumento que quero recuperar.

function minhaFuncao()
{
	if( func_num_args() == 0 )
		die( "Necessario pelo menos 1 parametro" );
	else
		print "Existem ".func_num_args()." parametros";
 
	if ($numargs >= 2)
	{
		print "O segundo argumento é: " . func_get_arg (1);
	}
}
 
minhaFuncao( 1,2,3,4,5,6,7,8,9,10 );

// Irá imprimir “Existem 10 parametros - O segundo argumento é 2″

Para recuperar uma lista com todos os argumentos (valores), passados para a função,devo usar func_get_args()

function minhaFuncao()
{
	if( func_num_args() == 0 )
		die( "Necessario pelo menos 1 parametro" );
	else
		print "Existem ".func_num_args()." parametros";
 
	foreach( func_get_args() as $key=>$val )
	{
		print "O argumento numero " .$key. " é " . $val ;
	}
}
minhaFuncao( 1,2,3,4,5,6,7,8,9,10 );

Irá imprimir
/*
Existem 10 parametros
O argumento numero 0 é 1
O argumento numero 1 é 2
O argumento numero 2 é 3
O argumento numero 3 é 4
O argumento numero 4 é 5
O argumento numero 5 é 6
O argumento numero 6 é 7
O argumento numero 7 é 8
O argumento numero 8 é 9
O argumento numero 9 é 10
*/

Esta é uma alternativa interessante para deixar o código fonte mais limpo e legível,
ficando a critério do desenvolvedor da aplicação a melhoria e incremento dessa metodologia.

[ ] ‘ sss

Adicione ->del.icio.us | Reddit | Slashdot | Digg | Facebook | Technorati | Google | StumbleUpon | Windows Live | Tailrank | Furl | Netscape | Yahoo | BlinkList

PHP – ORACLE – ADODB – Controle de Transação

Categoria - Desenvolvimento, PHP - Por - Alessandro Rocha No Comments »

images.jpgadodb.giforacle.jpg

Irei mostrar como utilizar o controle de transação do Oracle utilizando ADODB.

O ADODB é uma camada de abstração de banco de dados que suporta diversos tipos de bancos existentes, implementa a tarefa de controle de transação de forma à facilitar a nossa vida.

Esse controle é muito útil quando há a necessidade de executar um comando SQL somente se outro comando SQL definido previamente for executado com sucesso.

Uma transação pode ser definida como um conjunto de comandos SQL, armazenada no shared buffer cache ,que para sua efetiva finalização deve ser declarado o comando “commit” ou “rollback”.O “commit” executa e finaliza o bloco de comandos, enquanto o “rollback” executa, porém não finaliza efetivamente o bloco, retornando ao estado anterior.

No SQLPlus teriamos o seguinte exemplo :

Você precisa realizar um UPDATE em uma tabela qualquer, com 100.000 registros.

Exemplo : alterar na tabela endereço a rua do usuário com o “id” igual a 10.

SQL -> UPDATE ENDERECO SET RUA = ‘RUA XV’ WHERE BAIRRO = ‘BAIRRO BRASIL’;

….

100.000 rows updated : /

Alguma coisa estranha nesse comando certo !? Porém por uma distração qualquer você já executou o comando de forma que todos os usuários da tabela do Bairro Brasil agora moram na Rua XV.

Você não precisa entrar em desespero, pois ainda não executou o comando “commit”, então as alterações não foram efetivamente gravadas no banco.

O que você deveria fazer nesse momento se estivesse utilizando o sqlplus do Oracle

SQL> ROLLBACK; //Irá voltar ao estado anterior

Rollback complete

SQL-> UPDATE ENDERECO SET RUA = ‘RUA XV’ WHERE BAIRRO = ‘BAIRRO BRASIL’ and ID = 10; // Executando o comando certo

1 row updated

SQL-> COMMIT; // Encerra a transação com o comando “commit”

Agora veremos um exemplo usando PHP aonde a transação só realizará o “commit” se as outra for bem sucedida.

Lembrando que se você estiver usando sequence, esta será incrementada normalmente, mesmo que a execução tenha falhado.

Na prática seria algo simples, como este exemplo:

require_once( "adodb.inc.php" );
 
//Essa variável define o modo debug
//do ADODB, que imprimirá todos os SQL's na tela
//Muito útil para um ambiente de desenvolvimento.
//Para desabilitar basta deixar em branco
define( DB_DEBUG , "debug" );
 
//Essa é a string de conexão para Oracle
//Para outros bancos de dados mude o driver
//Por exemplo, ao invés de "oci8?,"mysql" para
//mysql e assim por diante
define( DB_DNS , "oci8://usuario:senha@servidor/?".DB_DEBUG );
 
/**
* Exemplo de conexão ADODB com
* simples controle de transação
*/
 
class TrasacaoADODB
{
/**
* Recebe os dados a serem gravados
*/
 
public function InserirDados( $vetor_dados )
{
 
//Cria uma conexão
$banco_dados = NewADOConnection( DB_DNS );
 
//Inicia o controle de transação
$banco_dados->BeginTrans();
 
//! Insere dados na tabela 1
$sql_1 = "INSERT INTO TABELA1 VALUES
( SEQ.NEXTVAL,'$vetor_dados[0]',$vetor_dados[1]')";
 
//! Insere dados na tabela 2
$sql_2 = "INSERT INTO TABELA2 VALUES
('$vetor_dados[2]','$vetor_dados[3]',$vetor_dados[4]')";
 
//! Insere dados na tabela 3
$sql_3 = "INSERT INTO TABELA2 VALUES
('$vetor_dados[5]','$vetor_dados[6]',$vetor_dados[7]')";
 
//! Insere dados na tabela 4
$sql_4 = "INSERT INTO TABELA2 VALUES
('$vetor_dados[8]','$vetor_dados[9]',$vetor_dados[10]')";
 
$sucesso = $banco_dados->Execute( $sql_1 );
 
if( $sucesso )
$sucesso = $banco_dados->Execute( $sql_2 );
 
if( $sucesso )
$sucesso = $banco_dados->Execute( $sql_3 );
 
if( $sucesso )
$sucesso = $banco_dados->Execute( $sql_4 );
 
if( $sucesso )
{
 
//Encerra controle de transação somente se todos
//os comandos foram executados com sucesso
$banco_dados->CommitTrans();
 
//Retorna "true" em caso de sucesso
$status = true
 
} else {
 
//Efetua um rollback em caso de falha
//fazendo com que os dados não sejam gravados
$banco_dados->RollbackTrans();
 
$status = false;
}
 
//! Encerra conexão
$banco_dados->Close();
 
//Retorna o status (true ou false)
return $status;
}
 
}
Adicione ->del.icio.us | Reddit | Slashdot | Digg | Facebook | Technorati | Google | StumbleUpon | Windows Live | Tailrank | Furl | Netscape | Yahoo | BlinkList
WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in