我正在尝试在我的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)
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)