Arquivo da tag: Asp.Net

Encurtador de URL's

Essa semana, aproveitei para colocar um pequeno projeto para funcionar, arquitetei e montei um Encurtador de URL’s que faz utilização do Dot Net Framework 4, SQL Server 2008, C#, integração com Web Services.

Da forma como foi feito encurtará apenas um pouco mais de 6 milhões de URL’s, mas está muito fácil para alterar o algorítimo para ter 5 caracteres ao invés de 4 na chave da URL.

A idéia é evoluir esse software e se aumentar muito a quantidade de acessos utilizar um banco de dados como o Apache Cassandra.

O Encurtador de URL’s está disponível no link http://devd.im, e o código fonte está em http://sourceforge.net/projects/devdim.

http://devd.im/

Upload de imagem com recorte usando Jquery e asp.net

Quem nunca quis disponibilizar, em sua aplicação, a possibilidade de o usuário subir uma imagem e recortá-la, como vários sites já fazem? Dei uma pesquisada, estudei sobre o System.Drawing,  jquery e resolvi compartilhar aqui o que consegui. Veja só.

Bibliotecas

A primeira coisa a ser feita aqui é baixar alguns arquivos, faça o download do jquery e dojcrop.

Namespaces

Inclua os seguintes namespaces em sua página:

  • System.IO
  • System.Drawing
  • System.Drawing.Imaging
  • System.Drawing.Drawing2D

O namespace System.Drawing sera utilizado com apelido SD

Formulário

Adicione três controles do tipo Panel no formulário, conforme a tabela abaixo:

ID Visible
UploadPanel True
ImagemOriginalPanel False
ImagemRecortadaPanel False

Dentro do UploadPanel adicione os controles dessa forma:

Tipo ID Text Visible
FileUpload ArquivoFileUpload N/A True
Button UploadButton Upload True
Label ErroLabel “” False

Dentro do ImagemOriginalPanel adicione os controles como mostrado:

Tipo ID Text
Image OriginalImage N/A
Button RecortarButton Recortar
HiddenField XHiddenField N/A
HiddenField YHiddenField N/A
HiddenField WHiddenField N/A
HiddenField HHiddenField N/A

Dentro do ImagemRecortadaPanel adicione o seguinte controle:

Tipo ID Text
Image ImagemRecortadaImage N/A

O código da sua página deve estar bem parecido com este:

    <form id="form1" runat="server">         <asp:Panel ID="UploadPanel" runat="server">             <asp:FileUpload ID="ArquivoFileUpload" runat="server"/>             <asp:Button ID="UploadButton" runat="server" Text="Upload" />         </asp:Panel>         <asp:Panel ID="ImagemOriginalPanel" runat="server" Visible="false">             <asp:Image ID="OriginalImage" runat="server" />             <asp:Button ID="RecortarButton" runat="server" Text="Recortar" />             <asp:HiddenField ID="XHiddenField" runat="server" />             <asp:HiddenField ID="YHiddenField" runat="server" />             <asp:HiddenField ID="WHiddenField" runat="server" />             <asp:HiddenField ID="HHiddenField" runat="server" />         </asp:Panel>         <asp:Panel ID="ImagemRecortadaPanel" runat="server" Visible="false">             <asp:Image ID="ImagemRecortadaImage" runat="server" />         </asp:Panel>

Estrutura do site

Adicione uma pasta com o nome imagens ao site.

Arquivos das bibliotecas

Adicione os seguintes arquivos no site:

  • jquery.min.js
  • jquery.Jcrop.js
  • jquery.Jcrop.css

HTML

Inclua as referências para os arquivos na sua página.

<script src="jquery.min.js" /></script> <script src="jquery.Jcrop.js" /></script> <link rel="stylesheet" href="jquery.Jcrop.css" type="text/css" />

Aplicando o Jcrop

Inclua as seguintes funções na sua página:

        jQuery(document).ready(function(){             jQuery('#OriginalImage').Jcrop({                 onSelect: marcaPontos             });         });         function marcaPontos(c) {             jQuery('#XHiddenField').val(c.x);             jQuery('#YHiddenField').val(c.y);             jQuery('#WHiddenField').val(c.w);             jQuery('#HHiddenField').val(c.h);         };               

É realmente muito simples. Jcrop foi aplicado ao controle OriginalImage que está dentro de ImagemOriginalPanel, e um handler foi adicionado ao evento de selecionar a imagem. Isso acontecerá quando o usuário tiver acabado de selecionar a área da imagem que deseja manter. O handler chamada a função marcaPontos, que define os valores dos campos XHiddenField, HiddenField, WHiddenField e HHiddenField passando as coordenadas.

Code Behind

O código abaixo irá pegar o caminho físico da pasta imagens e guardá-lo na variável pasta, declare-o no começo da classe da página.

string pasta = HttpContext.Current.Request.PhysicalApplicationPath + "imagens\\";

No evento click do botão upload adicione o seguinte código:

    protected void UploadButton_Click(object sender, EventArgs e) { bool extensaoPermitida = false; bool arquivoGravado = false; if (ArquivoFileUpload.HasFile) { string extensaoArquivo = Path.GetExtension(ArquivoFileUpload.FileName); string[] extensoesPermitidas = { ".png", ".jpg", ".gif", ".jpeg" }; for (int i = 0; i < extensoesPermitidas.Length; i++) if (extensoesPermitidas[i] == extensaoArquivo) extensaoPermitida = true; if (extensaoPermitida) { try { ArquivoFileUpload.PostedFile.SaveAs(pasta + ArquivoFileUpload.FileName); arquivoGravado = true; } catch (Exception ex) { ErroLabel.Text = "Ocorreu um problema na tentativa de salvar o arquivo." + ex.ToString(); ErroLabel.Visible = true; arquivoGravado = false; } } else { ErroLabel.Text = string.Format("Tipo de arquivo inválido. Tipo aceitos {0}.", extensoesPermitidas.ToString()); ErroLabel.Visible = true; } if (arquivoGravado) { ImagemOriginalPanel.Visible = true; OriginalImage.ImageUrl = "imagens/" + ArquivoFileUpload.FileName; Session["arquivo"] = ArquivoFileUpload.FileName; } } }

No evento click do botão recortar adicione o seguinte código:

   protected void RecortarButton_Click(object sender, EventArgs e) { string nomeArquivo = Session["arquivo"].ToString(); int eixoX = Convert.ToInt32(XHiddenField.Value); int eixoY = Convert.ToInt32(YHiddenField.Value); int largura = Convert.ToInt32(WHiddenField.Value); int altura = Convert.ToInt32(HHiddenField.Value); byte[] recorte = Recortar(pasta + nomeArquivo, largura, altura, eixoX, eixoY); using (MemoryStream ms = new MemoryStream(recorte, 0, recorte.Length)) { ms.Write(recorte, 0, recorte.Length); using (SD.Image imagemRecortada = SD.Image.FromStream(ms, true)) { string salvarEm = pasta + "crop" + nomeArquivo; imagemRecortada.Save(salvarEm, imagemRecortada.RawFormat); ImagemOriginalPanel.Visible = false; ImagemRecortadaPanel.Visible = true; ImagemRecortadaImage.ImageUrl = "imagens/crop" + nomeArquivo; } } }

Crie um método do tipo void conforme abaixo.

  private byte[] Recortar(string nomeAbsolutoArquivo, int largura, int altura, int eixoX, int eixoY) { try { using (SD.Image imagemOriginal = SD.Image.FromFile(nomeAbsolutoArquivo)) { using (SD.Bitmap bitmap = new System.Drawing.Bitmap(largura, altura)) { bitmap.SetResolution(imagemOriginal.HorizontalResolution, imagemOriginal.VerticalResolution); using (SD.Graphics grafico = SD.Graphics.FromImage(bitmap)) { grafico.SmoothingMode = SmoothingMode.AntiAlias; grafico.InterpolationMode = InterpolationMode.HighQualityBicubic; grafico.PixelOffsetMode = PixelOffsetMode.HighQuality; grafico.DrawImage(imagemOriginal, new System.Drawing.Rectangle(0, 0, largura, altura), eixoX, eixoY, largura, altura, SD.GraphicsUnit.Pixel); MemoryStream ms = new MemoryStream(); bitmap.Save(ms, imagemOriginal.RawFormat); return ms.GetBuffer(); } } } } catch (Exception ex) { throw ex; } }

Agora é só colocar tudo para rodar. Não é um bicho de sete cabeças, a questão é juntar tudo.

Referências

 

Espero que esse artigo sirva para agregar conhecimento à comunidade. Até a próxima.

Integração com redes sociais usando .NET

Primeiro, vamos definir o que é uma rede social:

Uma rede social é uma estrutura social compostapor pessoas (ou organizações, territórios, etc.) – designadas como nós – que estão conectadas por um ou vários tipos de relações (de amizade, familiares, comerciais, sexuais, etc.), ou que partilham crenças, conhecimento ou prestígio – Wkipedia

Do meu ponto de vista, vejo as ferramentas de networking como Facebook e Linkedin com redes sociais também.

Encurtando URL

Para encurtar a URL utilizaremos o serviço do site tinyurl.com, é muito simples, basta passar chamar a URL http://tinyurl.com/api-create.php, passando o parâmetro url com o caminho completo da sua url, ou seja, ficaria assim, se fôssemos implementar:

http://tinyurl.com/api-create.php?url=SUA_URL

Pré-requisitos

  • .Net Framework 2.0 ou superior
  • Visual Studio 2005 ou compatível

Projeto

Crie um novo Website, na Default.aspx adicione os seguintes controles:

Tipo ID
TextBox UrlTextBox
Button GerarUrlsButton
LinkButton OrkutLinkButton
LinkButton TwitterLinkButton
LinkButton FacebookLinkButton
Label UrlLabel

 

O código da página ficará semelhante com o código abaixo:

<asp:TextBox ID="UrlTextBox" runat="server"></asp:TextBox> <asp:Button ID="GerarUrlsButton" runat="server" Text="Gerar URL's" OnClick="GerarUrlsButton_Click"> </asp:Button> <br /> <asp:LinkButton ID=" OrkutLinkButton" runat="server" Text="Orkut"></asp:LinkButton> <br /> <asp:LinkButton ID="TwitterLinkButton" runat="server" Text="Twitter"></asp:LinkButton> <br /> <asp:LinkButton ID="FacebookLinkButton" runat="server" Text="Facebook"></asp:LinkButton> <br /> asp:Label ID="UrlLabel" runat="server"></asp:Label>

Namespaces

Inclua os seguintes namespaces na sua página:

  • System.Net
  • System.IO
  • System.Text

Code Behind

Eu fiz um método que busca a url resumida no tinyurl, dessa maneira basta apenas adicioná-la a um link.

  /// <summary> /// Devolve a url resumida /// </summary> /// <param name="url">url completa</param> /// <returns>url resumida</returns> protected string ObterUrlCurta(string url) { try { if (!url.ToLower().StartsWith("http") && !url.StartsWith("ftp")) { url = "http://" + url; } WebRequest request = WebRequest.Create("http://tinyurl.com/api-create.php?url=" + url); WebResponse response = request.GetResponse(); string urlCurta = string.Empty; using (StreamReader reader = new StreamReader(response.GetResponseStream())) { urlCurta = reader.ReadToEnd(); } // se tudo der certo, devolve a url resumida return urlCurta; } catch (Exception) { // se ocorrer erro devolve a mesma url return url; } }

Para obter a url do Facebook eu utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Facebook /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tituloPagina">título da página</param> /// <returns>url resumida do facebook</returns> public string ObterUrlFacebook(string urlParaCompartilhar, string tituloPagina) { StringBuilder url = new StringBuilder(string.Format("http://www.facebook.com/sharer.php?u={0}&t={1}", ObterUrlCurta(urlParaCompartilhar), tituloPagina)); return url.ToString(); }

Para obter a url do Twiiter eu utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Twitter /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tweet">mensagem/tweet</param> /// <param name="usuarioTwitter">por quem ou qual canal</param> /// <returns>url resumida do twitter</returns> public string ObterUrlTwitter(string urlParaCompartilhar, string tweet, string usuarioTwitter) { StringBuilder url = new StringBuilder(string.Format("http://twitter.com/home?status={0} {1}", ObterUrlCurta(urlParaCompartilhar), tweet)); if (usuarioTwitter != string.Empty) url.Append(string.Format(" - por (@{0})", usuarioTwitter)); return url.ToString(); }

E para o Orkut, utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Orkut /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tituloPagina">título da página</param> /// <returns>url resumida do orkut</returns> public string ObterUrlOrkut(string urlParaCompartilhar, string tituloPagina) { StringBuilder url = new StringBuilder(string.Format("http://promote.orkut.com/preview?nt=orkut.com&tt={0}&du={1}", ObterUrlCurta(urlParaCompartilhar), tituloPagina)); return url.ToString(); }

No evento onclick do botão GerarUrlsButton, adicione o seguinte código:

/// <summary> /// Gera url's para os links /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void GerarUrlsButton_Click(object sender, EventArgs e) { // limpa os atributos link orkut OrkutLinkButton.Attributes.Clear(); // adiciona o evento onclick chamando a função javascript abrirPagina e passa o parâmetro url OrkutLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlOrkut( UrlTextBox.Text, "Teste Orkut"))); TwitterLinkButton.Attributes.Clear(); TwitterLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlTwitter( UrlTextBox.Text, "Teste Twitter", "seu_usuario_twitter_ou_outro"))); FacebookLinkButton.Attributes.Clear(); FacebookLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlFacebook( UrlTextBox.Text, "Teste Facebook"))); UrlLabel.Text = UrlTextBox.Text; UrlTextBox.Text = string.Empty; }

Muito simples e bem legal, a possibilidade de o visitante ou cliente do site poder compartilhar o conhecimento e gerar conteúdo em redes sociais é muito boa, desde que seu site seja bom, ou sua empresa realmente preste um bom serviço.

Mais uma vez espero que esse artigo contribua para a comunidade.

Referências

Postando no Twitter com .NET

Olá, pessoal! Após um tempo sem escrever, volto aqui com um assunto bem bacana, integração com redes sociais. Vamos dar uma olhada em como usar uma API que o Twitter disponibiliza e uma API do site Migre.me para mandarmos as mensagens “via API” com a URL encurtada. Podemos fazer isso com aplicações web e desktop.

Vamos lá!

Web

Crie um novo website e, no code behind da página Default.aspx, adicione os seguintes usings/imports:

  • System.Net;
  • System.IO;
  • System.Xml;
  • System.Web

C#

  • using System.Net;
  • using System.IO;
  • using System.Xml;
  • using System.Web;

VB.NET

  • Imports System.Net
  • Imports System.IO
  • Imports System.Xml
  • Imports System.Web

Agora, na página Default.aspx, adicione os seguintes controles:

ID Tipo
EmailTextBox TextBox
SenhaTextBox TextBox TextMode=Password
ByTextBox TextBox
UrlTextBox TextBox
MensagemTextBox TextBox
PostarButton Button Text=Postar

Seu código deve ter ficado parecido com este:

            <table>

                <tr>

                    <td>

                        E-mail

                    </td>

                    <td>

                        <asp:TextBox ID="EmailTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        Senha

                    </td>

                    <td>

                        <asp:TextBox ID="SenhaTextBox" runat="server" TextMode="Password"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        Mensagem

                    </td>

                    <td>

                        <asp:TextBox ID="MensagemTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        URL

                    </td>

                    <td>

                        <asp:TextBox ID="UrlTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        By

                    </td>

                    <td>

                        <asp:TextBox ID="ByTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td colspan="2">

                        <asp:Button ID="PostarButton" runat="server" Text="Postar" OnClick="PostarButton_Click" />

                    </td>

                </tr>

            </table>

Migre.Me

Nesse momento iremos fazer nossa aplicação conversar com a API do migre.me. Vamos usar a API que retorna um XML.

No Code Behind, crie uma função que retorna uma string chamada CreateMigreMeUrl, que recebe três parâmetros também do tipo string, denominadas by, url, message, conforme os exemplos abaixo:

C#

    public string CreateMigreMeUrl(string by, string url, string message)

    {

        string retorno = string.Empty;

        // essa url será acessada pelo nosso sistema para gerar a url encurtada

        string urlMigreMe = string.Format("http://migre.me/api.xml?url={0}", url);

         // o WebClient é classe que irá "baixar" o retorno da URL do Migre.me

        WebClient client = new WebClient();

 // O Stream irá ler o retorno do WebClient

        Stream stream = client.OpenRead(urlMigreMe);

         // O XmlTextReader é utilizado para receber os dados do Stream

        XmlTextReader xmlReader = new XmlTextReader(stream);

         // Nesse momento é feita uma busca pelo nó do XML que contém no valor o texto "http://migre.me/", assim que o texto é encontrado a variável retorno é montada

        while (xmlReader.Read())

        {

            if (xmlReader.NodeType == XmlNodeType.Text)

            {

                if (xmlReader.Value.ToLower().Contains("http://migre.me/"))

                {

                    retorno = string.Format("{0} {1} {2}", message, xmlReader.Value, by);

                }

            }

        }

        return retorno;

    }

VB.NET

   Public Function CreateMigreMeUrl(ByVal by As String, ByVal url As String, ByVal message As String)

        Dim retorno As String = String.Empty

        Dim urlMigreMe = String.Format("http://migre.me/api.xml?url={0}", url)

        Dim client As New WebClient

        Dim stream As Stream

        stream = client.OpenRead(urlMigreMe)

        Dim xmlReader As New XmlTextReader(stream)

        While xmlReader.Read

            If xmlReader.NodeType == XmlNodeType.Text  Then

                If xmlReader.Value.ToLower().Contains("http://migre.me") Then

                    retorno = String.Format("{0} {1} {2}", message, xmlReader.Value, by)

                End If

            End If

        End While

        Return retorno

    End Function

Twitter

Agora faremos a função que será responsável por postar nosso tweet. É bastante simples: crie uma função do tipo void chamada PostTweet, que recebe três parâmetros do tipo string, denominados username, password e tweet.

C#

    public static void PostTweet(string username, string password, string tweet)

    {

        try

        {

// Os dados do usuário são "Codificados" nesse momento

            string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password));

            // a variável byte recebe a saída do post

            byte[] bytes = System.Text.Encoding.UTF8.GetBytes("status=" + tweet);

            // Inicializa o HttpWebRequest

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");

// Define o método como POST

            request.Method = "POST";

            // se verdadeiro espera respostas para requisições POST. O valor padrão é true.

            request.ServicePoint.Expect100Continue = false;

            // adiciona o cabeçalho de autenticação da API do Twitter

            request.Headers.Add("Authorization", "Basic " + user);

            // Definie o cabeçalho

            request.ContentType = "application/x-www-form-urlencoded";

            // Tamanho do buffer

            request.ContentLength = bytes.Length;

// Pega o retorno

            Stream reqStream = request.GetRequestStream();

// Escreve o retorno

            reqStream.Write(bytes, 0, bytes.Length);

// Fecha a requisção

            reqStream.Close();

        }

        catch (Exception ex)

        {

            // As exceções devem ser tratadas aqui

        }

    }

VB.NET

    Public Sub PostTweet(ByVal username As String, ByVal password As String, ByVal tweet As String)

        Try

            Dim user As String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password))

            Dim bytes() As Byte = System.Text.Encoding.UTF8.GetBytes("status=" + tweet)

            Dim request As HttpWebRequest

            request = HttpWebRequest.Create("http://twitter.com/statuses/update.xml")

            request.ServicePoint.Expect100Continue = False

            request.Headers.Add("Authorization", "Basic " + user)

            request.ContentType = "application/x-www-form-urlencoded"

            request.ContentLength = bytes.Length

            Dim reqStream As Stream = request.GetRequestStream()

            reqStream.Write(bytes, 0, bytes.Length)

            reqStream.Close()

        Catch ex As Exception

            'As exceções devem ser tratadas aqui

        End Try

    End Sub

No evento, click no botão postar adicione o seguinte código:

C#

PostTweet(EmailTextBox.Text, SenhaTextBox.Text, CreateMigreMeUrl(ByTextBox.Text, UrlTextBox.Text, MensagemTextBox.Text));

VB.NET

PostTweet(EmailTextBox.Text, SenhaTextBox.Text, CreateMigreMeUrl(ByTextBox.Text, UrlTextBox.Text, MensagemTextBox.Text))

Referências

http://migre.me/api-migreme/

http://dev.twitter.com/

Com isso, finalizamos o desenvolvimento dessa integração, basta agora utilizarmos um usuário válido para postar alguma coisa no Twiiter.

Espero que isso tenha agregado valor a vocês.

Um grande abraço e até a próxima.