<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">.NET del día a día</title><subtitle type="html">By Ronny Carreras
MVP en ASP.NET</subtitle><id>http://geeks.ms/blogs/rcarreras/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/rcarreras/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/rcarreras/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-09-08T15:41:00Z</updated><entry><title>Subiendo archivos asíncrono en asp.net con el control “AsyncFileUpload”</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/10/04/subiendo-archivos-as-237-ncrono-en-asp-net-con-el-control-asyncfileupload.aspx" /><id>/blogs/rcarreras/archive/2009/10/04/subiendo-archivos-as-237-ncrono-en-asp-net-con-el-control-asyncfileupload.aspx</id><published>2009-10-05T01:10:00Z</published><updated>2009-10-05T01:10:00Z</updated><content type="html">&lt;p&gt;Recientemente se liber&amp;oacute; una nueva versi&amp;oacute;n del famoso &amp;ldquo;Ajax Control Toolkit&amp;rdquo;, adicional a los arreglos y estabilidad que exhibe el release, este incluye dos nuevos controles: SEADRAGON y ASYNCFILEUPLOAD de este ultimo dedicar&amp;eacute; este post.&lt;/p&gt;
&lt;p&gt;Para nadie es un secreto que uno de los dolores de cabeza de los desarrolladores que usan ASP.NET AJAX, espec&amp;iacute;ficamente los &amp;ldquo;UpdatePanels&amp;rdquo; es la limitaci&amp;oacute;n de poder incluir dentro de este, un control de &amp;ldquo;FileUpload&amp;rdquo; para la carga de archivos. En los buscadores y foros te daras cuenta que un gran numero de desarrolladores ha tenido que hacer implementaciones complejas, comprar control o desistir de hacer una carga de archivo as&amp;iacute;ncronas dentro del update panel. Para este problema los chicos del AJAX Control Toolkit desarrollaron el control &amp;ldquo;AsyncFileUpload&amp;rdquo; que es un control bien sencillo de implementar y adem&amp;aacute;s mantiene la caracter&amp;iacute;sticas de los ya conocidos controles del toolkit.&lt;/p&gt;
&lt;p&gt;Basicamente el control se define as&amp;iacute;:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;toolkit&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;AsyncFileUpload &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AsyncFileUpload1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadError&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadError&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadComplete&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadComplete&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;UploaderStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Modern&amp;quot;  
       &lt;/span&gt;&lt;span style="color:red;"&gt;ThrobberID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;UploadingBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;#CCFFFF&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;CompleteBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Aqua&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Este control est&amp;aacute; compuesto por los siguientes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eventos&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadedComplete&lt;/span&gt;: evento que ocurre en el servidor cuando la cargar del archivo ha sido satisfactorio. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadedFileError&lt;/span&gt;: evento que ocurre en el servidor cuando la carga del archivo ha generado alg&amp;uacute;n error. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Propiedades&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;CompleteBackColor&lt;/span&gt;: El color de fondo del control cuando la carga ha sido completada. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ContentType&lt;/span&gt;: Se obtiene el tipo de contenido (MIME Content Type) del archivo cargado. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ErrorBackColor&lt;/span&gt;: el color de fondo del control cuando la carga ha genrado un error. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Filename&lt;/span&gt;: se obtiene el nombre del archivo. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Hasfile&lt;/span&gt;: un boleano que indica si el control tiene archivo o no. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;OnClientUploadError&lt;/span&gt;: el nombre de la funcion de Javascript que se ejecutar&amp;aacute; si falla la carga. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;OnClientUploadComplete&lt;/span&gt;: el nombre de la funcion de Javascript que se ejecutar&amp;aacute; cuando se complete la carga. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;PostedFile&lt;/span&gt;: se obtiene un objeto HttpPostedFile con acceso al archivo cargado. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;ThrobberID&lt;/span&gt;: (debi&amp;oacute; ser ProgressImage) Es el ID del control que mostrar&amp;aacute; el progreso. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploaderStyle&lt;/span&gt;: define la apariencia del control (Tradicional o Moderno). &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;UploadingBackColor&lt;/span&gt;: color de fondo del control cuando est&amp;aacute; cargando el archivo. &lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;Width&lt;/span&gt;: define el largo del control. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Metodos&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SaveAS(archivo as string): Guarda el archivo pasandole como parametro la ruta y el nombre del archivo. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la implementaci&amp;oacute;n que anexo en este post el HTML se observa de esta forma:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;form1&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;asp&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ScriptManager &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;sm&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; /&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;h1&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
       &lt;/span&gt;Carga de archivo as&amp;iacute;ncrona&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;h1&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;demoTitle&amp;quot;&amp;gt;
       &lt;/span&gt;Demostraci&amp;oacute;n Control &amp;quot;AsyncFileUpload&amp;quot;
   &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadArea&amp;quot;&amp;gt;
       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;toolkit&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;AsyncFileUpload &lt;/span&gt;&lt;span style="color:red;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AsyncFU&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadError&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadError&amp;quot;
       &lt;/span&gt;&lt;span style="color:red;"&gt;OnClientUploadComplete&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;uploadComplete&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;UploaderStyle&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Modern&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;ThrobberID&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot;
       &lt;/span&gt;&lt;span style="color:red;"&gt;UploadingBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;#CCFFFF&amp;quot; 
       &lt;/span&gt;&lt;span style="color:red;"&gt;CompleteBackColor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;AliceBlue&amp;quot; /&amp;gt;
       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Throbber&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; 
           &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;display&lt;/span&gt;: &lt;span style="color:blue;"&gt;none&lt;/span&gt;;&lt;span style="color:blue;"&gt;&amp;quot;&amp;gt;
           &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;img &lt;/span&gt;&lt;span style="color:red;"&gt;align&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;middle&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;alt&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;src&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;indicator.gif&amp;quot; /&amp;gt;
       &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Ultimo evento del lado del servidor:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;msgServerSide&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot;&amp;gt;
   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;br &lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
       &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Eventos del lado del cliente:&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;strong&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;msgClientSide&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;runat&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;server&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;display&lt;/span&gt;: &lt;span style="color:blue;"&gt;none&amp;quot;&amp;gt;
   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;div&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
   &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;form&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estas funciones de javascript le permiten al control crear comportamientos y funcionalidades directamente en el cliente:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;
        function &lt;/span&gt;uploadError(sender, args) {
            &lt;span style="color:blue;"&gt;var &lt;/span&gt;divmsg = $get(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;%= msgClientSide.ClientID %&amp;gt;&amp;quot;&lt;/span&gt;);
            divmsg.className = &lt;span style="color:#a31515;"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;;
            divmsg.style.display = &lt;span style="color:#a31515;"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;;
            divmsg.innerHTML = &lt;span style="color:#a31515;"&gt;&amp;#39;File: &amp;#39; &lt;/span&gt;+ args.get_fileName() +
            &lt;span style="color:#a31515;"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39; &lt;/span&gt;+ &lt;span style="color:#a31515;"&gt;&amp;#39;Error: &amp;#39;
            &lt;/span&gt;+ args.get_errorMessage();

        }
        &lt;span style="color:blue;"&gt;function &lt;/span&gt;uploadComplete(sender, args) {
            &lt;span style="color:blue;"&gt;var &lt;/span&gt;divmsg = $get(&lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;%= msgClientSide.ClientID %&amp;gt;&amp;quot;&lt;/span&gt;);
            divmsg.className = &lt;span style="color:#a31515;"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;;
            divmsg.style.display = &lt;span style="color:#a31515;"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;;
            divmsg.innerHTML = &lt;span style="color:#a31515;"&gt;&amp;#39;File: &amp;#39; &lt;/span&gt;+ args.get_fileName() + &lt;span style="color:#a31515;"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39;
             &lt;/span&gt;+ &lt;span style="color:#a31515;"&gt;&amp;#39;Length: &amp;#39; &lt;/span&gt;+ args.get_length() + &lt;span style="color:#a31515;"&gt;&amp;#39;bytes&amp;#39;&lt;/span&gt;;
        }
        
    &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Del lado del cliente manejamos los eventos inyectando scripts a trav&amp;eacute;s del scriptmanager.&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;Protected Sub &lt;/span&gt;AsyncFU_UploadedComplete(&lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;sender &lt;span style="color:blue;"&gt;As Object&lt;/span&gt;, _
              &lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;e &lt;span style="color:blue;"&gt;As &lt;/span&gt;AjaxControlToolkit.AsyncFileUploadEventArgs) _
              &lt;span style="color:blue;"&gt;Handles &lt;/span&gt;AsyncFU.UploadedComplete

    &lt;span style="color:blue;"&gt;Dim &lt;/span&gt;myScript = &lt;span style="color:#a31515;"&gt;&amp;quot;top.$get(&amp;#39;&amp;quot; &lt;/span&gt;&amp;amp; msgServerSide.ClientID &amp;amp; _
   &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;).innerHTML = &amp;#39;Estatus: Satisfactorio &amp;lt;br/&amp;gt;  Archivo: &amp;quot; &lt;/span&gt;&amp;amp; e.filename &amp;amp; _
   &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;lt;br/&amp;gt; Tama&amp;ntilde;o: &amp;quot; &lt;/span&gt;&amp;amp; AsyncFU.FileBytes.Length.ToString() &amp;amp; &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;;&amp;quot;
    &lt;/span&gt;ScriptManager.RegisterClientScriptBlock(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.GetType(), &lt;span style="color:#a31515;"&gt;&amp;quot;size&amp;quot;&lt;/span&gt;, myScript, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)

    &lt;span style="color:green;"&gt;&amp;#39;AsyncFU.SaveAs(&amp;quot;AQUI VA LA RUTA PARA GRABAR EL ARCHIVO&amp;quot;)

&lt;/span&gt;&lt;span style="color:blue;"&gt;End Sub

Protected Sub &lt;/span&gt;AsyncFU_UploadedFileError(&lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;sender &lt;span style="color:blue;"&gt;As Object&lt;/span&gt;, _
              &lt;span style="color:blue;"&gt;ByVal &lt;/span&gt;e &lt;span style="color:blue;"&gt;As &lt;/span&gt;AjaxControlToolkit.AsyncFileUploadEventArgs) _
              &lt;span style="color:blue;"&gt;Handles &lt;/span&gt;AsyncFU.UploadedFileError

    &lt;span style="color:blue;"&gt;Dim &lt;/span&gt;myScript = &lt;span style="color:#a31515;"&gt;&amp;quot;top.$get(&amp;#39;&amp;quot; &lt;/span&gt;&amp;amp; msgServerSide.ClientID &amp;amp; _
    &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;).innerHTML = &amp;#39;Error: &amp;quot; &lt;/span&gt;&amp;amp; e.statusMessage &amp;amp; &lt;span style="color:#a31515;"&gt;&amp;quot;&amp;#39;;&amp;quot;
    &lt;/span&gt;ScriptManager.RegisterClientScriptBlock(&lt;span style="color:blue;"&gt;Me&lt;/span&gt;, &lt;span style="color:blue;"&gt;Me&lt;/span&gt;.GetType(), &lt;span style="color:#a31515;"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;, myScript, &lt;span style="color:blue;"&gt;True&lt;/span&gt;)

&lt;span style="color:blue;"&gt;End Sub&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Desde &lt;a target="_blank" href="http://ofhf0a.blu.livefilestore.com/y1phYj-SwOY4b1wfMsuTdN7mCnmAOP9GRCfzk-Aar7cEJCIUodZ0x9lrlGbJ1naXDtTdY8XKJW240GMQNCJX5M024qPpNHX6rfk/AsynFileUpload.rar"&gt;aqu&amp;iacute;&lt;/a&gt; puedes descargar el proyecto que utiliza el control.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="color:#808000;font-size:medium;"&gt;Conclusiones&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permite usar el control dentro de un Updatepanel. &lt;/li&gt;
&lt;li&gt;Se pueden manejar funcionalidades del lado del cliente. &lt;/li&gt;
&lt;li&gt;Soluciona en gran parte el problema de cargar de archivo as&amp;iacute;ncrono en asp.net. &lt;/li&gt;
&lt;li&gt;Si ocurre un error la ruta del archivo seleccionado persiste en el control. &lt;/li&gt;
&lt;li&gt;Permite tener acceso a diferente estado cuando se carga el archivo. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Contra&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No tiene la capacidad para m&amp;uacute;ltiples archivo. &lt;/li&gt;
&lt;li&gt;Por alguna raz&amp;oacute;n cuando seleccionas el archivo la carga se hace autom&amp;aacute;tica. &lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157371" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="ASP.NET" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET/default.aspx" /><category term="AsyncFileUpload" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/AsyncFileUpload/default.aspx" /><category term="AJAX Control Toolkit" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/AJAX+Control+Toolkit/default.aspx" /><category term="ASP.NET AJAX" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET+AJAX/default.aspx" /></entry><entry><title>Configurando SQL Server 2008 para enviar emails (paso a paso)</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/09/16/configurando-sql-server-2008-para-enviar-emails-paso-a-paso.aspx" /><id>/blogs/rcarreras/archive/2009/09/16/configurando-sql-server-2008-para-enviar-emails-paso-a-paso.aspx</id><published>2009-09-17T00:53:00Z</published><updated>2009-09-17T00:53:00Z</updated><content type="html">&lt;p&gt;Hoy en d&amp;iacute;a la mayor&amp;iacute;as de las aplicaciones hacen uso de los servicios de Exchange o SMTP para enviar correos electr&amp;oacute;nicos a los usuarios, en muchas ocasiones el env&amp;iacute;o del correo lo hacemos a trav&amp;eacute;s de la aplicaci&amp;oacute;n misma pero existen escenarios en donde es preferible hacer el env&amp;iacute;o de correos desde nuestro repositorio de datos.&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n mostrar&amp;eacute; paso a paso como configurar el servicio de correos en SQL Server 2008, como asignar permisos a usuarios de base de datos para que utilicen el profile que hemos creado para el env&amp;iacute;o de correos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 1: Creaci&amp;oacute;n del &amp;ldquo;Profile&amp;rdquo; y el &amp;ldquo;Account&amp;rdquo;&lt;/strong&gt;, en el &amp;ldquo;Managment Studio&amp;rdquo; click derecho sobre &amp;ldquo;Database Mail&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/01_5F00_1E52DA6E.png"&gt;&lt;img height="321" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/01_5F00_thumb_5F00_08D0C56D.png" alt="0[1]" border="0" title="0[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/11_5F00_594E1CD4.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/11_5F00_thumb_5F00_68E9523F.png" alt="Paso 2" border="0" title="Paso 2" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/21_5F00_4AC6E4B2.png"&gt;&lt;img height="422" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/21_5F00_thumb_5F00_4751133E.png" alt="2[1]" border="0" title="2[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;Si es la primera vez que configura el servicio, entonces debes activarlo dando click en la opci&amp;oacute;n &amp;ldquo;yes&amp;rdquo;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/31_5F00_4B86FCD1.png"&gt;&lt;img height="98" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/31_5F00_thumb_5F00_23D05ADA.png" alt="3[1]" border="0" title="3[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/41_5F00_436F0ED5.png"&gt;&lt;img height="426" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/41_5F00_thumb_5F00_79DC6E7F.png" alt="4[1]" border="0" title="4[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/51_5F00_315EB749.png"&gt;&lt;img height="416" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/51_5F00_thumb_5F00_35D47669.png" alt="5[1]" border="0" title="5[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/61_5F00_01DC0EB1.png"&gt;&lt;img height="424" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/61_5F00_thumb_5F00_5CFA85D2.png" alt="6[1]" border="0" title="6[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/71_5F00_73B90BB4.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/71_5F00_thumb_5F00_4949883F.png" alt="7[1]" border="0" title="7[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/81_5F00_7DC998E0.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/81_5F00_thumb_5F00_49752400.png" alt="8[1]" border="0" title="8[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/91_5F00_799BAD1C.png"&gt;&lt;img height="420" width="484" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/91_5F00_thumb_5F00_336AA46F.png" alt="9[1]" border="0" title="9[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 2: Enviar un Email&lt;/strong&gt;, despues que la configuracion esta hecha existen dos formas de probar nuestro servicio, el primero es desde la ventana &amp;ldquo;Send Test Email&amp;rdquo;&amp;nbsp; o ejecutando el procedure &amp;ldquo;sp_send_dbmail&amp;rdquo; veamos los ejemplos:&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/101_5F00_087EC838.png"&gt;&lt;img height="294" width="424" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/101_5F00_thumb_5F00_7681E8D0.png" alt="10[1]" border="0" title="10[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="500" valign="top"&gt;El envio desde T-SQL es: &lt;br /&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;EXEC &lt;/span&gt;msdb&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_send_dbmail &lt;/span&gt;@profile_name&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;BlogProfile&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@recipients&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;prueba@dominio.com&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@subject&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Mensaje de Prueba&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;@body&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Este es el cuerpo del mensaje y escribo un texto de prueba.&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La lista completa de parametros que recibe este &amp;ldquo;Store Procedure&amp;rdquo; puedes conseguirlo desde &lt;a target="_blank" href="http://mce_host/controlpanel/blogs/posteditor.aspx/EXEC%20msdb.dbo.sp_send_dbmail%20@profile_name=&amp;#39;BlogProfile&amp;#39;,"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paso 3: Asingaci&amp;oacute;n de Permisos&lt;/strong&gt;, Sucede que esta configuraci&amp;oacute;n y la prueba ls hice con un usuario &amp;ldquo;sysadmin&amp;rdquo;, pero ni necesitamos que cualquier usuario en nuestra base de datos utilice este &amp;ldquo;Profile&amp;rdquo; para enviar email debemos de otorgarle el permiso ejecutando este script:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;USE &lt;/span&gt;msdb
&lt;span style="color:blue;"&gt;GO
EXEC &lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_adduser &lt;/span&gt;@loginame&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;AQUI VA EL USERNAME&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;br /&gt;@grpname&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;DatabaseMailUserRole&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El administrador de base de datos puede monitorear los mensajes enviados a traves de las siguientes vistas o tablas que estan en la base de datos &amp;ldquo;MSDB&amp;rdquo;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sysmail_allitems : verifica todos los items enviados.&lt;/li&gt;
&lt;li&gt;sysmail_faileditems:&amp;nbsp; los correos que han fallado.&lt;/li&gt;
&lt;li&gt;sysmail_event_log: El log de eventos de los emails.&lt;/li&gt;
&lt;li&gt;sysmail_mailattachments: la vista de los attachments.&lt;/li&gt;
&lt;li&gt;entre otros.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;** Puedes seguirme en &lt;a target="_blank" href="http://twitter.com/ronnycarreras"&gt;twitter&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155986" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="SQL" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/SQL/default.aspx" /><category term="SQL Server 2008" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/SQL+Server+2008/default.aspx" /></entry><entry><title>Subiendo y tocando videos en ASP.NET</title><link rel="alternate" type="text/html" href="/blogs/rcarreras/archive/2009/09/08/subiendo-y-tocando-videos-en-asp-net.aspx" /><id>/blogs/rcarreras/archive/2009/09/08/subiendo-y-tocando-videos-en-asp-net.aspx</id><published>2009-09-08T18:41:00Z</published><updated>2009-09-08T18:41:00Z</updated><content type="html">&lt;p&gt;Hace unos d&amp;iacute;as un compa&amp;ntilde;ero me pidi&amp;oacute; que le ayudara a incluir la funcionalidad de cargar y ver video en un portal de venta de veh&amp;iacute;culo, los requerimientos eran los siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permitir al usuario cargar al portal diferentes tipos de video, espec&amp;iacute;ficamente los m&amp;aacute;s populares AVI, WMV, MPG, MP4. &lt;/li&gt;
&lt;li&gt;Hacer encoding de los videos cargados para reducir su tama&amp;ntilde;o considerablemente a fin de que usuarios con poco ancho de banda puedan ver los videos. &lt;/li&gt;
&lt;li&gt;Una vez cargado el video, permitir al usuario ver el video convertido. &lt;/li&gt;
&lt;li&gt;El video cargado por el usuario no puede exceder los 50MB. &lt;/li&gt;
&lt;li&gt;El t&amp;iacute;pico requerimiento, que los componentes involucrados no alteren los costos del proyecto. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Haciendo una vista r&amp;aacute;pida de los requerimientos no parece dif&amp;iacute;cil desarrollar este feature, pero la realidad es que aunque es muy popular ver video en los website no es tan f&amp;aacute;cil como parece. Primero porque hay pocos componentes gratuitos para estos fines, segundo la documentaci&amp;oacute;n para hacer esta tarea no es tan abundante en internet (por eso me anime a publicar este articulo) y tercero hacer el encoding en l&amp;iacute;nea hace la tare un poco mas dif&amp;iacute;cil.&lt;/p&gt;
&lt;p&gt;Para desarrollar estos requerimientos utilic&amp;eacute; las siguientes herramientas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visual Studio 2008 (tambien puedes usar Visual Web Developer 2008). &lt;/li&gt;
&lt;li&gt;ASP.NET &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://ffmpeg.org/"&gt;FFmpeg&lt;/a&gt; (para hacer encoding de los videos) la documentaci&amp;oacute;n la puede encontrar &lt;a target="_blank" href="http://ffmpeg.org/ffmpeg-doc.html"&gt;Aqu&amp;iacute;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://flowplayer.org/index.html"&gt;Flowplayer&lt;/a&gt; (para ver los videos convertidos a flv) la documentacion la puede encontrar &lt;a target="_blank" href="http://flowplayer.org/demos/index.html"&gt;Aqu&amp;iacute;&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El &amp;ldquo;Website Project&amp;rdquo; creado contiene los directorios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Player: contiene los archivos utilizados para visualizar un video. &lt;/li&gt;
&lt;li&gt;Videos: almacena los videos, tanto el original cargado por el usuario, asi como tambien el convertido a flv. &lt;/li&gt;
&lt;li&gt;ffmpeg.exe: el ejecutable utilizado para hacer el encoding a los videos. &lt;/li&gt;
&lt;li&gt;Dos paginas que detallaremos a continuacion. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La primera p&amp;aacute;gina &amp;ldquo;UploadVideo.aspx&amp;rdquo; se encarga de permitirle al usuario cargar su propio video, esta se compone del HTML especificado m&amp;aacute;s abajo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        Video Website - Upload Videos&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;h1&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:FileUpload&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;videoFile&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="attr"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnUpload&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Upload video&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;btnUpload_Click&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;lblErrorVideo&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;EnableViewState&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;False&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;CssClass&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;redbold&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si tiene experiencia cargando archivo desde ASP.NET sabr&amp;aacute;s que por defecto no se pueden cargar archivos que excedan los 4MB por lo que debemos de modificar el web.config de nuestro web.config, espec&amp;iacute;ficamente debajo del tag &amp;lt;system.web&amp;gt; de esta forma:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.web&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;httpRuntime&lt;/span&gt; &lt;span class="attr"&gt;maxRequestLength&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;51200&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El atributo &amp;ldquo;&lt;span class="attr"&gt;&lt;span style="color:#ff0000;"&gt;maxRequestLength&lt;/span&gt;&lt;/span&gt;&amp;rdquo; se especifica en KB.&lt;/p&gt;
&lt;p&gt;Lo interesante de esta p&amp;aacute;gina ocurre en su code behind, observemos:&lt;/p&gt;
&lt;p&gt;Variables globales utilzadas en el codigo (esto puede venir del web.config o del cualquier otra configuraci&amp;oacute;n).&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//Ruta en donde se van a guardar los videos.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoOriginalPath = &lt;span class="str"&gt;&amp;quot;~/Videos/Original/&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoConvertedPath = &lt;span class="str"&gt;&amp;quot;~/Videos/Converted/&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//Variables utilizadas para manejar los nombres.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoTmpName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; flv = &lt;span class="str"&gt;&amp;quot;.flv&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; videoConvertedName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El c&amp;oacute;digo que ejecuta el evento Click del button Upload se encarga de validar la extensiones permitidas (l&amp;iacute;nea 6), que el archivo no exceda los 50MB (l&amp;iacute;nea 13)&amp;nbsp; y en la l&amp;iacute;nea 26 se hace el encoding y si todo resulta bien, entonces direccionamos a la p&amp;aacute;gina de visualizaci&amp;oacute;n de videos.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; btnUpload_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        HttpPostedFile file = videoFile.PostedFile;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="rem"&gt;//Validamnos la extension del archivo&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!ValidateVideoExtension(file.FileName))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;La extension del archivo no es permitido.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="rem"&gt;//Verificamos el tamano del archivo de que no exceda los 50MB.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (file.InputStream.Length &amp;gt; 52428800)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;El video no puede exceder los 50MB&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;//Guardamos el video&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; saveAs = Server.MapPath(videoOriginalPath);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        videoTmpName = Guid.NewGuid().ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; originalVideo = saveAs + videoTmpName + &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(file.FileName).Extension;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        file.SaveAs(originalVideo);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="rem"&gt;//Hacemos el Encondding del video&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (EncodingVideo(originalVideo)){&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Response.Redirect(&lt;span class="str"&gt;&amp;quot;MyVideos.aspx?Id=&amp;quot;&lt;/span&gt; + videoConvertedName);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            lblErrorVideo.Text = &lt;span class="str"&gt;&amp;quot;Error convirtiendo el video, intente nuevamente&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;La funcion &amp;ldquo;ValidateVideoExtension&amp;rdquo; se l&amp;iacute;mita a verificar la extensi&amp;oacute;n del archivo cargado:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ValidateVideoExtension(&lt;span class="kwrd"&gt;string&lt;/span&gt; filename)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {        &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        FileInfo info = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(filename);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (info.Extension.ToLower())&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.mpg&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.wmv&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.avi&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;.mp4&amp;quot;&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la funci&amp;oacute;n &amp;ldquo;EncodingVideo&amp;rdquo; hacemos uso de la Clase &amp;ldquo;Process&amp;rdquo; bajo el namespace &amp;ldquo;System.Diagsnotics&amp;rdquo;, esta clase nos permite hacer ejecucion de procesos locales o remotos, en este caso la ejecuci&amp;oacute;n del ffmpeg.exe.&amp;nbsp; En la l&amp;iacute;nea 8 se espec&amp;iacute;fican los parametros utilizados para el encoding,&amp;nbsp; la definicion de estos par&amp;aacute;metros se encuentran en la &lt;a target="_blank" href="http://ffmpeg.org/documentation.html"&gt;documentaci&amp;oacute;n del ffmpeg&lt;/a&gt;,&amp;nbsp; un metodo que es imprescindible para este proceso en linea es &amp;ldquo;encoding.WaitForExit()&amp;rdquo; el cual espera a que el proceso concluya.&amp;nbsp; debajo el codigo de esta funci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; EncodingVideo(&lt;span class="kwrd"&gt;string&lt;/span&gt; originalVideo)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;false&lt;/span&gt;;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; saveAs = Server.MapPath(videoConvertedPath);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        videoConvertedName = videoTmpName + flv;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="rem"&gt;//Parametros que se le pasaran al ejecutable para fines de encoding.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; args = &lt;span class="str"&gt;@&amp;quot; -i &amp;quot;&lt;/span&gt; + originalVideo + &lt;span class="str"&gt;&amp;quot; -b 200 -r 24 -s 320x240 -deinterlace -ab 64k &amp;quot;&lt;/span&gt; + saveAs + videoConvertedName;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="rem"&gt;//Hacemos uso de la clase proxy la cual nos provee acceso directo al ejecutable.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (Process enconding = &lt;span class="kwrd"&gt;new&lt;/span&gt; Process())&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        {            &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            enconding.StartInfo.WorkingDirectory = Server.MapPath(&lt;span class="str"&gt;&amp;quot;~/&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            enconding.StartInfo.FileName = Server.MapPath(&lt;span class="str"&gt;&amp;quot;ffmpeg.exe&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            enconding.StartInfo.Arguments = args;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            enconding.StartInfo.UseShellExecute = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            enconding.StartInfo.CreateNoWindow = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            enconding.StartInfo.RedirectStandardOutput = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            enconding.Start();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="rem"&gt;//Como es un proceso en linea debemos esperar a que termine para mostrar el video sino el player dar&amp;aacute; un error de FileNotFound.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            enconding.WaitForExit();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;value&lt;/span&gt; = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;      }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una vez concluido el proceso de &amp;ldquo;Encoding&amp;rdquo; tendremos en la carpeta /Videos/Converted/ el video flv, el cual mostraremos en la segunda p&amp;aacute;gina llamada &amp;ldquo;MyVideo.aspx&amp;rdquo;, el cual llamaremos pasandole por Querystrings el nombre del video a mostrar.&amp;nbsp; El HTML es este:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;My Videos Zone&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="rem"&gt;&amp;lt;!-- Hacemos referencia de la libreria que contiene el flowPlayer --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Player/flowplayer-3.1.3.min.js&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;lt;body&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;  &amp;lt;h1&amp;gt;Video Website - My Video Zone&amp;lt;/h1&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &amp;lt;form id=&lt;span class="str"&gt;&amp;quot;frmMain&amp;quot;&lt;/span&gt; runat=&lt;span class="str"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &amp;lt;div&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            flowplayer(&lt;span class="str"&gt;&amp;quot;player&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;player/flowplayer-3.1.3.swf&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;&amp;lt;!-- player container--&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;  &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;player&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;display: block; width: 320px;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            height: 240px;&amp;quot;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            &lt;span class="rem"&gt;&amp;lt;!-- Utilizado para colocar una mascara y evitar que el player toque el video automatico. --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;img&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Player/flow_eye.jpg&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;alt&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;My Video Player&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;a&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En la l&amp;iacute;nea 4 se hace referencia a la libreria de &lt;a target="_blank" href="http://flowplayer.org/demos/index.html"&gt;FlowPlayer&lt;/a&gt;, l&amp;iacute;nea 10 se coloca el player, l&amp;iacute;nea 14 el link sobre cual video hace referencia el player, este se asignar&amp;aacute; en el code behind de la siguiente manera:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (Request[&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;] != &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; video = &lt;span class="str"&gt;&amp;quot;~/Videos/Converted/&amp;quot;&lt;/span&gt; + Request[&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;].ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            player.HRef = video;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El resultado es genial un archivo WMV de 25MB puede ser reducido a 666KB, el proyecto en ejecuci&amp;oacute;n se veria&lt;/p&gt;
&lt;p&gt;de esta forma&lt;/p&gt;
&lt;table width="500" cellpadding="2" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="250" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/Upload1_5F00_045A18BD.gif"&gt;&lt;img height="105" width="240" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/Upload1_5F00_thumb_5F00_20A75ADD.gif" alt="Upload[1]" border="0" title="Upload[1]" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;td width="250" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/ViewVideo1_5F00_4AA75905.gif"&gt;&lt;img height="199" width="240" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rcarreras/ViewVideo1_5F00_thumb_5F00_21501107.gif" alt="ViewVideo[1]" border="0" title="ViewVideo[1]" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El codigo fuente puede ser descardo desde &lt;a target="_blank" href="http://cid-9b98bf3b8ff56d64.skydrive.live.com/self.aspx/Public/BlogPost/WebsiteVideos/VideosWebsite.zip"&gt;Aqu&amp;iacute;&lt;/a&gt;: &lt;/p&gt;
&lt;p&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET"&gt;ASP.NET&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/FFmpeg"&gt;FFmpeg&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/FlowPlayer"&gt;FlowPlayer&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Visual+Studio"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155490" width="1" height="1"&gt;</content><author><name>rcarreras</name><uri>http://geeks.ms/members/rcarreras/default.aspx</uri></author><category term="FlowPlayer" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/FlowPlayer/default.aspx" /><category term="FFmpeg" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/FFmpeg/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/rcarreras/archive/tags/ASP.NET/default.aspx" /></entry></feed>