Requisição HTTP (GET e POST) com VB (Visual Basic)
Olá mais uma vez!!
Aos amantes do VB (minha primeira linguagem de programação).
Hoje tabalho com PHP, Python, Javascript e tive a necessidade de fazer uma requisição a um servidor apache, usando o protocolo http com VB.
Em minhas pesquisas na net, encontrei muita coisa que infelizmente não funciona “porque as pessoas insistem em colocar coisas na net que não funcionam?”, emfim, como sempre chega de enrolação e vamos ao que interessa.
Seguinte, vamos usar uma referência a biblioteca Microsoft WinHttp Services, version 5.1.
Primeiros Passos:
- No visual basic, vá em Projetos > Referencess e marque a referência Microsoft WinHttp Services, version 5.1 indicada acima.
- Agora crie um módulo e um fomulário padrão no VB.
O formulário:
- 1 caixa de texto com Multiline: true e ScrollBar: vertical (Text1)
- 1 caixa de texto padrão (Text2)
- 1 botão de comando padrão (Command1)
Códificação para o formulário (UploadForm):
Private Sub Command1_Click() Dim nFile As String, Retorno As String nFile = "image1.jpg" 'imagem que será enviada e se encontra na pasta do projeto Me.Text2 = UploadFiles(nFile, "http://localhost/testes/upload.php?nome=luciano", App.Path) End Sub
Codificação para o módulo (UploadScript):
Option Explicit 'Créditos para Joseph Z. Xu (jzxu@napercom.com) 'Modificado por Luciano D. Mota (ldmotta@gmail.com)em 19 de setembro 2009 Dim WinHttpReq As WinHttp.WinHttpRequest Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0 Const HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1 Const BOUNDARY = "Xu02=$" Const HEADER = "--Xu02=$" Const FOOTER = "--Xu02=$--" Function UploadFiles(strFileName As Variant, strURL As String, DirPath As String, _ Optional postVar As String, Optional strUserName As String, _ Optional strPassword As String) As String Dim FName As String Dim strFile As String Dim strBody As String Dim aPostBody() As Byte Dim nFile As Integer Set WinHttpReq = New WinHttpRequest ' Turn error trapping on On Error GoTo SaveErrHandler ' Adiciono a url as variáveis passadas em Text1. strURL = strURL & "?" & postVar WinHttpReq.Open "POST", strURL, False If strUserName <> "" And strPassword <> "" Then ' Set the user name and password. WinHttpReq.SetCredentials strUserName, strPassword, _ HTTPREQUEST_SETCREDENTIALS_FOR_SERVER End If '-------------------------- Becareful not to mingle too much here ----------------------------------- ' Set the header WinHttpReq.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & BOUNDARY '-------------------------- Monta o corpo do arquivo para ser enviado ------------------------------- ' Assemble the body strBody = HEADER ' Starting tag FName = strFileName ' Grap the file strFile = getFile(FName) strBody = strBody & vbCrLf & "Content-Disposition: form-data; name=""" & "upload" & _ (i + 1) & """; filename=""" & FName & """" & vbCrLf & "Content-type: application/pdf" & _ vbCrLf & vbCrLf & strFile & vbCrLf strBody = strBody & "--Xu02=$" ' This is boundary tag between two files strFile = "" strBody = strBody & FOOTER ' Ending tag '---------------------------------------------------------------------------------------------------- ' Because of binary zeros, post body has to convert to byte array aPostBody = StrConv(strBody, vbFromUnicode) ' Send the HTTP Request. WinHttpReq.Send aPostBody ' Display the status code and response headers. UploadFiles = WinHttpReq.ResponseText Set WinHttpReq = Nothing Exit Function SaveErrHandler: UploadFiles = Err.Description Set WinHttpReq = Nothing End Function Function getFile(strFileName As String) As String Dim strFile As String ' Grap the file nFile = FreeFile Open strFileName For Binary As #nFile strFile = String(LOF(nFile), " ") Get #nFile, , strFile Close #nFile getFile = strFile End Function
Agora o código PHP:
/** * Simples upload de arquivo * Lembrando que este upload não deve ser utilizado no projeto real pois não teria segurança alguma, este é só para exemplo já que o foco principal é o objeto WinHttpRequest do visual basic * Author: ldmotta * Recebe a requisição feita pelo visual basic e grava o arquivo enviado no servidor. */ // Prepara a variável do arquivo $arquivo = isset($_FILES["upload"]) ? $_FILES["upload"] : FALSE; //Crie uma pasta de nome file no servidor e dê permissão de escrita $config["url_img"] = "file/"; $imagem_dir = $config["url_img"] . $arquivo["name"] if($arquivo) { // Faz o upload da imagem $r = move_uploaded_file($arquivo["tmp_name"], $imagem_dir); } if(file_exists($imagem_dir)); echo $imagem_dir; //Retorna a url relativa e o arquivo do upload exit;
Prontinho, qualquer dúvida é só incluir um comentário
Python Subprocess
Uma dica simples!!
O módulo subprocess lhe permite gerar novos processos, e obter os seus códigos de retorno. Este módulo pretende substituir vários outros módulos e funções mais antigas, tais como:
os.system
os.spawn *
os.popen *
popen2 .*
comandos .*
Neste pequeno exemplo, vou mostrar como compactar vários arquivos com o comando zip sendo chamado pelo móduoo subprocess.
1° Digamos que você tenha uma lista dos arquivos que serão “zipados”, esta lista pode vir do banco ou de outra forma dependendo de cada situação:
#lista dos arquivos que serão compactados li=["generic.html", "generic.json", "generic.xml"] #caminho dos arquivos que serão compactados path="/home/user/sites/seu_site/diretorio_dos_arquivos/" import os # monta o caminho completo para cada arquivo li=[os.path.join(path,item) for item in li] import subprocess # comando que será utilizado no subprocess, nele passamos uma lista contendo o comando ["zip", "nome_do_arquivo_destino"] cmd=["zip", "generic.zip"] # adiciona o comando do subprocess à lista de arquivos cmd.extend(li) # finalmente passa este comando para ser executado pelo subprocess.call() subprocess.call(cmd)
MKLINK – Links simbólicos no windows
Olá a todos!
Esta é uma das melhores novidades do windows, “Links Simbólicos” ou Junction Point, é isso messmo, pra quem pensava que esta era uma particularidade apenas do linux, o windows contraria tudo e suporta esse recurso.
Funciona assim:
Digamos que você queira disponibilizar todos os seus arquivos pessoais em uma unidade diferente da que o sistema operacional reside, e poder listar o conteúdo desta pasta dentro de uma nova no mesmo computador sem a necessidade de copiá-la, além disso a pasta “link” será atualizada e atualizará a pasta destino a cada alteração.
Faça da seguinte forma:
- Abra o prompt de comando do windows em Iniciar -> Executar, digite “cmd” e pressione enter.
- No prompt de comando, digite
mklink /D novo_link destino
, onde novo link é o nome do link que se quer criar, e destino a pasta a qual será listada neste novo link e /D diz ao mklink que se trata de um diretório. - Pressione Enter e prontinho, sua pasta pessoal vai está no destino que você quiser, e o link simbólico irá listar o conteúdo desta pasta.
Isso salvou a minha vida!! 🙂
Transformar html em PDF
Algo muito interessante e bastante utilizado que peguei no blog do Igor. Vamos lá!
1º Crie o php com o conteúdo html
<?php $html = “ <html> <head></head> <style> h1 {color:#333; size:20px; margin-bottom:5px;} h3 {color:#222;} </style> <body> <h1>ldmotta.wordpress.com</h1> </body> </html>”; ?>
2º Agora pra fazer a coisa funcionar, é assim.
<?php //Adicione a classe dompdf require_once("dompdf/dompdf_config.inc.php"); //Crie uma nova instância do dompdf $dompdf = new DOMPDF(); //Carregue o conteúdo hrml $dompdf->load_html($html); //Defina o tamanho do papel $dompdf->set_paper('letter', 'landscape'); //E por fim, renderize o arquivo pdf, chamando o method render() e o stream('caminho do arquivo'); $dompdf->render(); $dompdf->stream("exemplo-01.pdf"); ?>
É só isso “Chamar a função e passar os parâmetros!”
Baixe o dompdf aqui
Email com imagem de background
Olá mais uma vez!
Estou aqui pra falar sobre algo muito interessante porém pouco usado, talvez por sua complexidade em encontrar a combinação ideal de conteúdo e marcação de posições no corpo do email, para ser exibido corretamente.
Por este motivo criei uma classe bem simples chamada “imagemail” só pra facilitar a vida dos programadores.
Como usr?
<?php //Primeiro adicione a classe imagemail.php require_once('imagemail.php'); //Criando uma instancia da classe $im = imagemail::getInstance(); $imagem = "imagem.jpg" //caminho absoluto da imagem //Setando as variáveis para envio do email $im->add_from("Luciano <ldmotta@visie.com.br>"); $im->add_to("Destinatário <destinatario@mail.com.br>"); $im->add_subject("Título da mensagem"); $im->set_type("html"); //Defindo o conteúdo da mensagem $html=" <html> <body> Olá destinatário, veja esta foto<br /> {$im->add_image($imagem, 'Imagem')} </body> </html>"; $im->add_message($html); //E por fim, o envio da mensagem try{ $enviado=$im->send(); } catch (Exception $e) {$enviado=0;} return $enviado; //"enviado" não é o que vc está pensando :-) ?>
Blz né, então comenta ai.
Download da classe imagemail
base_url() no javascript
Olá a todos, como não poderia deixar de compartilhar com vocês, segue mais uma funçãozinha que peguei no blog do snipplr desta vez, algo que é usado constantemente por programadores php e que muitas vezes queremos fazer algo “inteligente” com o javascript.
function get_settings() {
var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location);
var settings = { "base_url" : base_url }
return settings;
}
settings = get_settings();
alert(settings.base_url);
jQuery lightBox com CodeIgniter
Implementando o “exelente” jQuery lightbox plugin com CodeIgniter
Foi atravéz da matéria do Leandro Vieira (iMasters) que implementou o Lightbox JS criado pelo Lokesh Dhakar, e outra do Gin2 (wiki do CodeIgniter), que resolvi inseri este plugin como biblioteca no codeigniter, dando ao usuário maior praticidade na hora do desenvolvimento e aplicação de lightbox em suas galeria.
Escolhi o jQuery lightbox plugin, porque além de bastante simples, faz o trabalho com maestria (parabéns Leonardo).
“Para este exemplo, estou levando em consideração que você tenha uma instalação do CI funcionando.”
1° PASSO
Baixe a última versão da biblioteca jQuery lightbox plugin e disponibilize em uma pasta da sua instalação do CI, neste caso, defini como na estrutura abaixo.

Estrutura de diretórios
2° PASSO
No header da view onde estará a sua galeria de imagens, insira o código que carrega a biblioteca
<script type="text/javascript" src="<?=base_url();?>skin/js/jquery.js"></script>
<script type="text/javascript" src="<?=base_url();?>skin/js/jquery.lightbox-0.5.min.js"></script>
3° PASSO
Em algum lugar na página, crie uma tag javascript que vai escrever a função definida na biblioteca lightbox.php
<script type="text/javascript">
<?=$this->lightbox->simple('profile_img');?>
</script>
Como definido no jQuery lightbox plugin, os objetos que farão parte da galeria devem obedecer o seguinte critério:
– Tag <a> com href apontando para a imagem em tamanho real
– Tag <img> exibindo o thumbnail
<a href="http://exemplo.com/imagens/imagem.jpg">
<img src="http://exemplo.com/imagens/thumb.jpg" alt="Nome da imagem" />
</a>
4° PASSO
Crie uma biblioteca de nome “lightbox.php” com o código abaixo:
<?php
class LightBox {
function simple($target='simpleModal') {
$block = $this->jsBlock();
$url = base_url();
$output = "
$(function() {
$('#profile_img a').lightBox({
imageLoading:'{$url}skin/images/lightbox-ico-loading.gif',
imageBtnPrev:'{$url}skin/images/lightbox-btn-prev.gif',
imageBtnNext:'{$url}skin/images/lightbox-btn-next.gif',
imageBtnClose:'{$url}skin/images/lightbox-btn-close.gif',
imageBlank:'{$url}skin/images/lightbox-blank.gif'
}); // Seleciona todos os links dentro do elemento com ID galeria
});";
return $block['open'].$output.$block['close'];
}
function jsBlock() {
$blocks = array(
'open'=>''."\n\r",
'close'=>''."\n\r"
);
return $blocks;
}
}
?>
5° PASSO
Agora no controler que chama a view da sua galeria, instancie a biblioteca lightbox.php da seguinte forma:
function index() {
$this->load->library('lightbox');
$this->load->helper('url'); //assistente de url, usado ao chamar base_url()
}
rsync local e remoto
Mais uma vez estou aqui pra compartilhar algo que aprendi recentemente, uma ferramenta poderosa, mas impraticável pela maioria dos desenvolvedores.
Depois de muito quebrar a cabeça arquivando com “tar”, compactando com “gzip”, dividindo com “split” e transferindo com “wget”, cheguei a conclusão:
“PARA TUDO!!! ISSO NÃO VAI DAR CERTO, VOU APRENDER RSYNC DE VERDADE!”.
E para a alegria geral da nação, está aí de forma simples e descomplicada.
1° vc quer transferir arquivos ou diretórios inteiros localmente; use isto.
$ rsync -Cravzp /diretorio/origem/ /diretorio/destino/ é só isso!!
2° Quer transferir pela rede sem autenticação?
$ rsync -Cravzp usuario@host:/diretorio/origem/ /diretorio/destino/ “mais simples que isso só isso elevado ao cubo.”
3° E agora o gran finale!!!
-Quer transferir de servidor pra servidor?
$ rsync -Cravzp -e “ssh -p1234” usuario@dominio.com.br:/diretorio/origem/ /diretorio/destino/
Dica: Se quiser apenas listar os arquivos do servidor? ignore o diretório de destino.
$ rsync -Cravzp -e “ssh -p1234” usuario@dominio.com.br:/diretorio/origem/
“Agora me diz: Como algo tão simples, poderoso e útil pode passar despercebido por tantos desenvolvedores?”
Obs.: Os parametros já estão configurados para a transferência de forma rápida e segura, mas caso ainda não confie em mim “e não deve confiar”, dê uma olhada no “man” do rsync.
Busca de CEP presonalizada
Olá a todos!
Depois de algum tempo sem postar, estou “me permitindo” atualizar o blog com mais uma dica utilizando o jQuery, implementado a partir do artigo encontrado no blog “Ajaxianos” do Wender Lima.
Desta vez um busca por cep onde você dita as regras.
Let’s go –>
Requerimentos:
- jquery.js
- busca_cep.js
Download: busca_cep.js
Demonstração: exemplo do Busca CEP
Documentaçao:
No header do seu formulário, inicialize a biblioteca busca_cep.js
<script language="javascript" src="js/busca_cep.js" type="text/javascript"></script>
Defina as opções obrigatórias (target e campos)
Options ={ target: "name_do_campo_cep", campos: { "rua" :"name_do_campo_rua", "bairro" :"name_do_campo_bairro", "cidade" :"name_do_campo_cidade", "estado" :"name_do_campo_estado" } };
Chamar o método initForms(opções)
initBuscaCep(Options)
*Obs. Você pode decidir quais campos quer preencher (rua, bairro, cidade, estado) passando o name dos inputs como valor do objeto”campos”
O código completo ficará como no exemplo abaixo.
<script type=”text/javascript”>
Options ={
target: “cep”,
//objeto com os names dos input do seu formulário
campos: {“rua”:”endereco”,”bairro”:”bairro”, “cidade”:”cidade”, “estado”: “estado”}
};
initBuscaCep(Options)
</script>
<form action=”http://sua_url.com.br”>
<label for=”cep”><input type=”text” id=”cep” name=”cep” /></label>
<label for=”rua”><input type=”text” id=”rua” name=”rua” /></label>
<label for=”bairro“><input type=”text” id=”bairro” name=”bairro” /></label>
<label for=”cidade“><input type=”text” id=”cidade” name=”cidade” /></label>
<label for=”estado“><input type=”text” id=”estado” name=”estado” /></label>
<input type=”button” value=”Enviar” />
</form>
Defina as propriedades obrigatórias para o correto funcionamento
- [target] String – Name do objeto de formulário referente ao CEP. Default = “cep” .
- [campos] Objeto – Recebe um objeto javascript correspondente aos nomes dos campos de cado objeto de formulário. Você pode decidir em recuperar os campos “rua, bairro, cidade, estado”. Ex.
campos: {"rua":"endereco","cidade":"cidade"}
Qualqer dúvida entrem em contato com ldmotta@visie.com.br. Comentários serão bem vindos.
jqFormulator – Carregando formulários com jQuery
Olá pessoal!!
Às vezes, nas brincadeiras de fim de semana, nos vem inspiração para resolver probleminhas do nosso cotidiano. Foi desta forma que resolvi criar uma “bibliotecazizinha” com jQuery que carregasse grandes formulários em uma página (magentopia) no estilo formulator, mas que desse ao usuário final uma experiência agradável ao ter que preencher cansativos passos destes formulários de cadastro.
Estou falando da jqFormulator, que está na versão “ontem.de.madrugada.1” e tambem está aberta a novas idéias e melhoramentos.
Requerimentos:
- jquery-1.3.2.min.js >
- jqFormulator.js
Download: jqFormulator.js
Demonstração: exemplo do jqFormulator
Documentaçao:
No header do seu formulário, inicialize a biblioteca jqFormulator.js
<script language="javascript" src="js/jqFormulator.js" type="text/javascript"></script>
Defina as opções obrigatórias (titles e files)
Options ={ type: "POST", titles: Array("Passo 1","Passo 2"), files: Array( "files/reserva-passo-1.php", "files/reserva-passo-2.php" ) };
Chamar o método initForms(opções)
initForms(Options)
Insira o seu formulário na página com id = ‘formulator’
<form id="formulator" method="post" action="jqFormulator.php"></form>
O código completo ficará como no exemplo abaixo.
<script type=”text/javascript”>
Options ={
type: “POST”,
//array com os títulos de cada passo
titles: Array(“Passo 1″,”Passo 2”),
//array com os formuláios que serão chamados
files: Array(
“files/reserva-passo-1.php”,
“files/reserva-passo-2.php”
)
};
initForms(Options)
</script>
<div id=”forms”>
<form id=”formulator” method=”post” action=”#”></form>
</div>
Defina as propriedades obrigatórias para o correto funcionamento
- [type] String – Refine o tipo de envio (GET ou POST) default: POST.
- [titles] Array – Recebe um array que serão os titulos de cada passo. Caso a quantidade de títulos passados seja inferior a quantidade de arquivos, o sistema irá atribuir títulos sequenciais. Ex.
titles: Array("Passo 1","Passo 2")
- [files] Array – Recebe um array com as urls dos arquivos que serão carregados. Ex.
Array (“files/cadastro/passo1.php”, “files/cadastro/passo2.php”, “files/cadastro/passo-n.php”)
Fig. 1 - Passo 1, na primeira exibição, o usuário só poderá acessar o formulário do passo 1.
Fig. 2 - Passo 2, ao clicar em prosseguir no passo 1, o título "Passo 1 e Passo 2" transformam-se em link permitindo ao usuário navegar entre o primeiro e segundo passos e assim suscessivamente. Espero que está humilde aplicação possa ser útil a todos. Qualqer dúvida entrem em contato com ldmotta@visie.com.br. Comentários serão bem vindos.
1 comment