由Stream.Position问题而吸引的思辨

   
这么使用是一向不问题的!当大家上传图片时,页面通过Post方法提交到服务端,服务端构造一个和图表字节大小同等的byte数组,通过HttpPostedFile的InputStream属性获得一个System.IO.Stream对象,然后利用该对象的Read方法将图纸数据流读到byte数组中。这几个历程页面是内需回传的,并且下五次用户上传图片时Stream对象会被再次协会,然后重新填充byte数组。

                    image = new ImageEntity();
                    image.Type = files[i].ContentType;
                    image.ImageBlob = bytes;
                    image.Title = Path.GetFileName(files[i].FileName);
                    images.Add(image);
                }
                catch { }
            }
        }
    }

    return images;
}

   
一开始我就感觉到这几个问题很想得到,看来问题应该是出在上传图片时图片的二进制数据获取得不得法或不完全,我再也调试跟踪了瞬间代码,发现在上传的长河中byte数组中的值始终都是0,就算是在通过Stream.Read方法填充数据之后也是这么。那到底是干吗?难道自己用错对象了?查了一下MSDN,发现上边给出的示范基本上也是通过那种方式取得要上传的文书并经过Stream.Read方法填充byte数组的,MSDN的言传身教代码肯定是不会有不当的,那错误到底在哪儿啊?我起来迷惑了…

                    image = new ImageEntity();
                    image.Type = files[i].ContentType;
                    image.ImageBlob = bytes;
                    image.Title = Path.GetFileName(files[i].FileName);
                    images.Add(image);
                }
                catch { }
            }
        }
    }

    if (files != null && files.Count > 0)
    {
        for (int i = 0; i < files.Count; i++)
        {
            if (files[i].FileName.Length != 0)
            {
                try
                {
                    fileLen = files[i].ContentLength;
                    Byte[] bytes = new Byte[fileLen];
                    using (Stream stream = files[i].InputStream)
                    {
                        stream.Position = 0;
                        stream.Read(bytes, 0, fileLen);
                    }

   
因为自己是在MOSS平台上支出的,与常常的ASP.NET项目就有过多的不等,有可能会遭到过多MOSS本身的事物影响,例如缓存机制等。但无论咋样,涉及到像Stream那样的目的,在利用未来最好都让它立即释放,因为即使Stream不被缓存,它也有可能长日子占据内存而消耗掉很多的服务器资源。提出在Using语句中动用Stream,并且在动用Read方法填充byte数组前重置Position为0,那样可以确保byte数组被科学填充,从而保障可以取得正确的文书数量。

   
Web开发中的文件上传功用一向以来都是一个相比较吃力的题目,越发是在开发Ajax网站时,面对功用复杂的页面元素,完成页面无刷新的文本上传成效就变得更加错综复杂。我在http://www.cnblogs.com/jaxu/archive/2009/05/19/1459796.html一文中牵线过什么样通过页面中躲藏的iFrame提交表单达到文件的上传,而且不刷新当页中的Form,模拟页面的无刷新文件上传功用。而且貌似景色下,大家在劳动端会那样来处理要上传的公文。

    public string Title { get; set; }
    public string Type { get; set; }
    public Byte[] ImageBlob { get; set; }
}

    return images;
}

public class ImageEntity
{
    public ImageEntity()
    {
    }

private List<ImageEntity> GetUploadImages()
{
    List<ImageEntity> images = new List<ImageEntity>();
    HttpFileCollection files = Request.Files;
    int fileLen;
    ImageEntity image = null;

private List<ImageEntity> GetUploadImages()
{
    List<ImageEntity> images = new List<ImageEntity>();
    HttpFileCollection files = Request.Files;
    int fileLen;
    ImageEntity image = null;

    if (files != null && files.Count > 0)
    {
        for (int i = 0; i < files.Count; i++)
        {
            if (files[i].FileName.Length != 0)
            {
                try
                {
                    fileLen = files[Ajax,i].ContentLength;
                    Byte[] bytes = new Byte[fileLen];
                    stream.Read(bytes, 0, fileLen);

    public ImageEntity(string title, Byte[] imageBlob, string type)
    {
        Title = title;
        ImageBlob = imageBlob;
        Type = type;
    }

   
那是一个取得客户端上传的图形文件的以身作则代码,其中的ImageEntity是一个Image的实体类,我们可以透过该实体类描述的音信将图纸存储在数据库中(或者存储在服务器磁盘上)。

   
但是在三次MOSS开发中本人偶然地觉察使用该方法上传图片时,保存图片到数据库没有出现问题,当从数据库中读取图片时却展现了一个黄色的叉,表示图片不可用或加载败北。仔细查阅了一晃数据库中的数据,除了保留图片二进制数据的字段彰显为<Binary
data>外,其他字段的多少都很正常,没有意识怎么相当情况,调试了一晃程序,图片上传和保留的历程中并没有抛出任何万分,一切都很顺畅,但就是在读取图片的时候页面上不能够正常加载图片。

   
仔细搜了搜谷歌(Google),其中有一位朋友给出的帮助对自家很有用,他提出在运用Stream.Read方法填充byte数组前先判断一下Stream.Position的值是否为0,借使不为0就先将它置为0,然后再拓展byte数组的填充。可是自己首先想到每一回页面在上传文件时所协会的Stream对象都是新的(因为页面会PostBack回来),我并从未在先后的别样地方缓存Stream对象,既然Stream对象是新的,那么Position属性的值肯定就是0啦。我抱着半信半疑的心气试了试那位情人介绍的章程,果然奏效了,看来Stream对象真正是在某个地点被缓存了,或者说在前几次文件上传之后Stream对象没有被完全释放。于是自己修改了上边的这些获得上传图片的方法。

相关文章