Пример #1
0
        void IHttpHandler.ProcessRequest(HttpContext context)
        {
            BlobHandlerInfo handler = BlobHandlerInfo.Current;

            if (handler == null)
            {
                throw new HttpException(404, String.Empty);
            }
            if (handler.Mode == BlobMode.Upload)
            {
                RenderUploader(context, handler, handler.SaveFile(context));
            }
            else
            {
                string tempFileName = Path.GetTempFileName();
                Stream stream       = File.Create(tempFileName);
                handler.LoadFile(stream);
                CopyToOutput(context, stream, handler);
                stream.Close();
                File.Delete(tempFileName);
            }
            HttpRequest request        = context.Request;
            bool        requireCaching = (request.IsSecureConnection && ((request.Browser.Browser == "IE") && (request.Browser.MajorVersion < 9)));

            if (!(requireCaching) && handler.Mode != BlobMode.Thumbnail)
            {
                context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            }
        }
Пример #2
0
        private void RenderUploader(HttpContext context, BlobHandlerInfo handler, bool uploadSuccess)
        {
            HtmlTextWriter writer = new HtmlTextWriter(context.Response.Output);

            writer.WriteLine("<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\" \\\"http://www.w3." +
                             "org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">");
            writer.AddAttribute("xmlns", "http://www.w3.org/1999/xhtml");
            writer.RenderBeginTag(HtmlTextWriterTag.Html);
            // head
            writer.RenderBeginTag(HtmlTextWriterTag.Head);
            writer.RenderBeginTag(HtmlTextWriterTag.Title);
            writer.Write("Uploader");
            writer.RenderEndTag();
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript");
            writer.RenderBeginTag(HtmlTextWriterTag.Script);
            string script = @"
                       
function ShowUploadControls() { 
    document.getElementById('UploadControlsPanel').style.display ='block'; 
    document.getElementById('StartUploadPanel').style.display = 'none';   
    document.getElementById('FileUpload').focus();      
} 
function Owner() {
    var m = window.location.href.match(/owner=(.+?)&/);
    return m ? parent.$find(m[1]) : null;
}
function StartUpload(msg) {
    if (msg && !window.confirm(msg)) return;
    if (parent && parent.window.Web) {
        var m = window.location.href.match(/&index=(\d+)$/);
        if (m) Owner()._showUploadProgress(m[1]);
    }
    document.forms[0].submit();
}
function UploadSuccess(key, message) { 
    if (parent && parent.window.Web) { 
        parent.Web.DataView.showMessage(message); 
        Owner().refresh(false,null,'FIELD_NAME');
    }     
    else 
        alert('Success');
}";

            writer.WriteLine(script.Replace("FIELD_NAME", handler.ControllerFieldName));
            writer.RenderEndTag();
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
            writer.RenderBeginTag(HtmlTextWriterTag.Style);
            writer.WriteLine("body{font-family:tahoma;font-size:8.5pt;margin:4px;background-color:white;}");
            writer.WriteLine("input{font-family:tahoma;font-size:8.5pt;}");
            writer.WriteLine("input.FileUpload{padding:3px}");
            writer.RenderEndTag();
            writer.RenderEndTag();
            // body
            string message = null;

            if (uploadSuccess)
            {
                if (HttpContext.Current.Request.Files[0].ContentLength > 0)
                {
                    message = String.Format(Localizer.Replace("BlobUploded", "<b>Confirmation:</b> {0} has been uploaded successfully. <b>It may take up to {1}" +
                                                              " minutes for the thumbnail to reflect the uploaded content.</b>"), handler.Text.ToLower(), Blob.ThumbnailCacheTimeout);
                }
                else
                {
                    message = String.Format(Localizer.Replace("BlobCleared", "<b>Confirmation:</b> {0} has been cleared."), handler.Text.ToLower());
                }
            }
            else
            if (!(String.IsNullOrEmpty(handler.Error)))
            {
                message = String.Format(Localizer.Replace("BlobUploadError", "<b>Error:</b> failed to upload {0}. {1}"), handler.Text.ToLower(), BusinessRules.JavaScriptString(handler.Error));
            }
            if (!(String.IsNullOrEmpty(message)))
            {
                writer.AddAttribute("onload", String.Format("UploadSuccess(\'{0}={1}\', \'{2}\')", handler.Key, handler.Value.Replace("u|", "t|"), BusinessRules.JavaScriptString(message)));
            }
            writer.RenderBeginTag(HtmlTextWriterTag.Body);
            // form
            writer.AddAttribute(HtmlTextWriterAttribute.Name, "form1");
            writer.AddAttribute("method", "post");
            writer.AddAttribute("action", context.Request.RawUrl);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "form1");
            writer.AddAttribute("enctype", "multipart/form-data");
            writer.RenderBeginTag(HtmlTextWriterTag.Form);
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            // begin "start upload" controls
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "StartUploadPanel");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.Write(Localizer.Replace("BlobUploadLinkPart1", "Click"));
            writer.Write(" ");
            writer.AddAttribute(HtmlTextWriterAttribute.Href, "#");
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "ShowUploadControls();return false");
            writer.RenderBeginTag(HtmlTextWriterTag.A);
            writer.Write(Localizer.Replace("BlobUploadLinkPart2", "here"));
            writer.RenderEndTag();
            writer.Write(" ");
            writer.Write(Localizer.Replace("BlobUploadLinkPart3", "to upload or clear {0} file."), handler.Text.ToLower());
            // end of "start upload" controls
            writer.RenderEndTag();
            // begin "upload controls"
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "UploadControlsPanel");
            writer.AddAttribute(HtmlTextWriterAttribute.Style, "display:none");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            // "FileUpload" input
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "File");
            writer.AddAttribute(HtmlTextWriterAttribute.Name, "FileUpload");
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "FileUpload");
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "FileUpload");
            writer.AddAttribute(HtmlTextWriterAttribute.Onchange, "StartUpload()");
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            // "FileClear" input
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "FileClear");
            writer.AddAttribute(HtmlTextWriterAttribute.Class, "FileClear");
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, String.Format("StartUpload(\'{0}\')", BusinessRules.JavaScriptString(Localizer.Replace("BlobClearConfirm", "Clear?"))));
            writer.AddAttribute(HtmlTextWriterAttribute.Value, Localizer.Replace("BlobClearText", "Clear"));
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            // end of "upload controls"
            writer.RenderEndTag();
            // close "div"
            writer.RenderEndTag();
            // close "form"
            writer.RenderEndTag();
            // close "body"
            writer.RenderEndTag();
            // close "html"
            writer.RenderEndTag();
            writer.Close();
        }
Пример #3
0
        private void CopyToOutput(HttpContext context, Stream stream, BlobHandlerInfo handler)
        {
            int offset = 0;

            stream.Position = offset;
            byte[] buffer = null;
            Image  img    = null;

            // attempt to auto-detect content type as an image
            if ((String.IsNullOrEmpty(handler.ContentType) || handler.ContentType.StartsWith("image/")) && (stream.Length > 0))
            {
                try
                {
                    img = Image.FromStream(stream);
                }
                catch (Exception)
                {
                    try
                    {
                        // Correction for Northwind database image format
                        offset          = 78;
                        stream.Position = offset;
                        buffer          = new byte[(stream.Length - offset)];
                        stream.Read(buffer, 0, buffer.Length);
                        img = Image.FromStream(new MemoryStream(buffer, 0, buffer.Length));
                    }
                    catch (Exception ex)
                    {
                        context.Trace.Write(ex.ToString());
                    }
                }
            }
            // send an original or a thumbnail to the output
            if (handler.Mode == BlobMode.Thumbnail)
            {
                // draw a thumbnail
                Bitmap    thumbnail = new Bitmap(92, 71);
                Graphics  g         = Graphics.FromImage(thumbnail);
                Rectangle r         = new Rectangle(0, 0, 91, 70);
                g.FillRectangle(Brushes.White, r);
                g.DrawRectangle(Pens.Silver, r);
                if (img != null)
                {
                    double thumbnailAspect = (Convert.ToDouble(r.Height) / Convert.ToDouble(r.Width));
                    r.Inflate(-2, -2);
                    if ((img.Width < r.Width) && (img.Height < r.Height))
                    {
                        r.Width  = img.Width;
                        r.Height = img.Height;
                    }
                    else
                    if (img.Width > img.Height)
                    {
                        r.Height = Convert.ToInt32((Convert.ToDouble(r.Width) * thumbnailAspect));
                        r.Width  = Convert.ToInt32((Convert.ToDouble(r.Height)
                                                    * (Convert.ToDouble(img.Width) / Convert.ToDouble(img.Height))));
                    }
                    else
                    if (img.Height > img.Width)
                    {
                        thumbnailAspect = (Convert.ToDouble(r.Width) / Convert.ToDouble(r.Height));
                        r.Width         = Convert.ToInt32((Convert.ToDouble(r.Height) * thumbnailAspect));
                        r.Height        = Convert.ToInt32((Convert.ToDouble(r.Width)
                                                           * (Convert.ToDouble(img.Height) / Convert.ToDouble(img.Width))));
                    }
                    else
                    {
                        r.Width  = Convert.ToInt32((Convert.ToDouble(img.Height) * thumbnailAspect));
                        r.Height = r.Width;
                    }
                    double aspect = (Convert.ToDouble((thumbnail.Width - 4)) / r.Width);
                    if (r.Width <= r.Height)
                    {
                        aspect = (Convert.ToDouble((thumbnail.Height - 4)) / r.Height);
                    }
                    if (aspect > 1)
                    {
                        aspect = 1;
                    }
                    r.Width    = Convert.ToInt32((Convert.ToDouble(r.Width) * aspect));
                    r.Height   = Convert.ToInt32((Convert.ToDouble(r.Height) * aspect));
                    r.Location = new Point(((thumbnail.Width - r.Width)
                                            / 2), ((thumbnail.Height - r.Height)
                                                   / 2));
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.DrawImage(img, r);
                }
                else
                {
                    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                    Font   f    = new Font("Arial", ((float)(7.5)));
                    string text = handler.FileName;
                    if (String.IsNullOrEmpty(text))
                    {
                        text = handler.Text;
                    }
                    else
                    {
                        text = Path.GetExtension(text);
                        if (text.StartsWith(".") && (text.Length > 1))
                        {
                            text = text.Substring(1).ToUpper();
                            f    = new Font("Arial", ((float)(12)), FontStyle.Bold);
                        }
                    }
                    g.DrawString(text, f, Brushes.Black, r);
                }
                // produce thumbnail data
                MemoryStream ts = new MemoryStream();
                thumbnail.Save(ts, ImageFormat.Png);
                ts.Flush();
                ts.Position = 0;
                byte[] td = new byte[ts.Length];
                ts.Read(td, 0, td.Length);
                ts.Close();
                // Send thumbnail to the output
                context.Response.AddHeader("Content-Length", td.Length.ToString());
                context.Response.ContentType = "image/png";
                context.Response.OutputStream.Write(td, 0, td.Length);
                if (img == null)
                {
                    context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                }
                else
                {
                    context.Response.Cache.SetCacheability(HttpCacheability.Public);
                    context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(Blob.ThumbnailCacheTimeout));
                }
            }
            else
            {
                string contentType = handler.ContentType;
                if ((img != null) && String.IsNullOrEmpty(contentType))
                {
                    contentType = ImageFormats[img.RawFormat.Guid];
                }
                if (String.IsNullOrEmpty(contentType))
                {
                    contentType = "application/octet-stream";
                }
                string fileName = handler.FileName;
                if (String.IsNullOrEmpty(fileName))
                {
                    fileName = String.Format("{0}{1}.{2}", handler.Key, handler.Reference, contentType.Substring((contentType.IndexOf("/") + 1)));
                }
                context.Response.ContentType = contentType;
                context.Response.AddHeader("Content-Disposition", ("filename=" + fileName));
                context.Response.AddHeader("Content-Length", stream.Length.ToString());
                stream.Position = offset;
                buffer          = new byte[(1024 * 32)];
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                while (bytesRead > 0)
                {
                    context.Response.OutputStream.Write(buffer, 0, bytesRead);
                    offset    = (offset + bytesRead);
                    bytesRead = stream.Read(buffer, 0, buffer.Length);
                }
            }
        }