文件通过Stream保存,但无法打开

Luc*_*tos 0 c#

我正在尝试在我的D:目录中保存图像,为了实现这一点,我Session将从我的FileUpload组件中保存一些信息.

在我的方法调用btnConfirm_Click我创建我Session和我的btnSave_Click方法我恢复此信息并尝试保存文件,但当我检查我的D:目录,该文件存在但是当我打开这个文件时,我看到了消息:The windows photo viewer can not open this picture because the file appears to be damaged, corrupted, or is too big ..

有人可以帮帮我吗?

C#代码

protected void btnConfirm_Click(object sender, EventArgs e)
{
 if (FileUpload1.HasFile)
            {
                string sFileName = FileUpload1.FileName;
                string fileExtension = System.IO.Path.GetExtension(sFileName).ToLower();
                foreach (string ext in new string[] { ".jpeg", ".jpg", ".png" })
                {
                    if (fileExtension == ext)
                    {
                        Session["Document"] = sFileName + fileExtension;
                        Session["Byte"] = FileUpload1.FileBytes;
                        Session["Content"] = FileUpload1.FileContent;
                        byte[] b = (byte[])Session["Byte"];
                    }
                }
           }
}


protected void btnSave_Click(object sender, EventArgs e)
        {
                if (Session["Document"].ToString() != null)
                {
                    try
                    {
                        byte[] byteArray = Encoding.UTF8.GetBytes(Session["Content"].ToString());                        
                        MemoryStream stream = new MemoryStream(byteArray);

                        sPath = "D:/123.jpg";
                        FileStream fileStream = File.Create(sPath, (int)stream.Length);                        
                        byte[] bytesInStream = new byte[stream.Length];
                        stream.Read(bytesInStream, 0, bytesInStream.Length);                        
                        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                    }
                    catch
                    {
                    }
              }
         }
Run Code Online (Sandbox Code Playgroud)

Jef*_*ter 5

byte[] byteArray = Encoding.UTF8.GetBytes(Session["Content"].ToString());
Run Code Online (Sandbox Code Playgroud)

这条线看起来非常错误.您正在使用字符串(编码为UTF8)并尝试将其转换为二进制JPG图像.这不行.您需要将原始图像保留为二进制(而不是文本+编码)形式.当你byte[]变成a string(反之亦然)时会出现信息丢失,因为文本编码不能(通常)表示所有字节序列.

正如@PanagiotisKanovas所提到的,您希望获得Session['Content']数据流.

顺便说一句,您没有关闭流,因此当您尝试打开文件时,对象仍然可以锁定.

using (FileStream fileStream = File.Create(sPath, (int)stream.Length)) {
   byte[] bytesInStream = new byte[stream.Length];
   stream.Read(bytesInStream, 0, bytesInStream.Length);                        
   fileStream.Write(bytesInStream, 0, bytesInStream.Length);
}
Run Code Online (Sandbox Code Playgroud)

  • AND Session ["Content"]是一个流,而不是一个字节数组 (2认同)