Wind-Eagle

No pain,no gain!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于异步上传图片以及上传完成后显示缩略图的问题

Posted on 2008-01-04 17:19  Andrew Yin  阅读(1039)  评论(0)    收藏  举报

今天看到一段代码,觉得还可以,虽然作者想要的功能没能够实现,但是值得讨论。
首先,我们想想要实现这样的功能该怎么做呢?
首先我们用经典的IFrame控件来实现文件的异步上传,也就是说文件上传的服务器端处理不是在原来页面的后置文件中,而是在Iframe窗口所打开的文件的后置代码中。注意,主窗口和Iframe窗口可以打开同一个地址的网页,也就是同一个网页,但是在服务器端,他们分别属于不同的实例,不同的Viewstate处理单位。
其次,我们需要文件上床成功后,在主页面刷新缩略图,因为文件上传的服务器端处理不是在原来页面的后置文件中,因此不可以直接在服务器端使用UpdatePanel.Update(),我们只能等文件上传完成并返回到客户端的Iframe窗口的时候发送消息到传页面通知其刷新缩略图,或者直接把缩略图的地址赋值给主页面的某个图片的SRC属性。注意,缩略图的地址可能并不是某个图片的地址,因为一般不存储一个缩略图副本在服务器文件系统,一般直接把一个ASPX文件的地址赋值给SRC属性,这个ASPX文件用于从原图生成缩略图并返回缩略图到客户端,关于生成缩略图的代码,请参考我的下一篇随笔。

以下代码仅供参考,并没有实现在主页面刷新缩略图的功能。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using Subgurim.Controles;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    private String ImageFolder = "~/temp";
    private Int32 ImgPerRow = 8;

    protected void Page_Load(object sender, EventArgs e)
    {
        ScriptManager1.RegisterAsyncPostBackControl(FileUploaderAJAX1);

        if (FileUploaderAJAX1.IsPosting)
            this.managePost();

        if (!Page.IsPostBack)
        {
            GenerateImagesTable();
        }
    }

    private void managePost()
    {
        HttpPostedFileAJAX pf = FileUploaderAJAX1.PostedFile;

        if ((pf.ContentType.Equals("image/gif") || pf.ContentType.Equals("image/jpeg") || pf.ContentType.Equals("image/pjpeg")) && pf.ContentLength 
<= 100 * 1024)
            FileUploaderAJAX1.SaveAs("~/temp", pf.FileName);


        GenerateImagesTable();

        UpdatePanel1.Update();
    }

    private void GenerateImagesTable()
    {
        DirectoryInfo dir 
= new DirectoryInfo(MapPath(ImageFolder));
        FileInfo[] files 
= dir.GetFiles();
        
UpdatePanel1.ContentTemplateContainer.Controls.Clear();

        if (files.Length 
== 0)
        {
            UpdatePanel1.ContentTemplateContainer.Controls.Add(new LiteralControl("Pas de fichiers présents dans ce dossier"));

            return;
        }

        Table ImgTable 
= new Table();
        TableRow ImgTableRow 
= new TableRow();
        TableCell ImgTableCell 
= new TableCell();

        UpdatePanel1.ContentTemplateContainer.Controls.Add(ImgTable);

        ImgTable.Rows.Add(ImgTableRow);

        ImgTable.Width 
= Unit.Percentage(100);

        
Int32 i = 0;
        
foreach (FileInfo file in files)
        {
            String FileName 
= file.Name;
            
if (i++ == ImgPerRow)
            {
                ImgTableRow 
= new TableRow();
                ImgTable.Rows.Add(ImgTableRow);

                i 
= 1;
            
}

            ImgTableCell 
= new TableCell();
            ImgTableRow.Cells.Add(ImgTableCell);

            ImgTableCell.HorizontalAlign 
= HorizontalAlign.Center;
            
ImgTableCell.Width = Unit.Percentage(12.5);

            
Image myImage = new Image();
            myImage.ImageUrl 
= ImageFolder + "/" + FileName;
            myImage.Width 
= Unit.Pixel(50);
            
myImage.Height = Unit.Pixel(50);

            
ImgTableCell.Controls.Add(myImage);
        }
    }
}