我的程序使用Telerik ASyncUpload控件以允许用户上传图像。该控件已配置为仅接受图像,并且在其FileUploaded事件中,还有一些额外的代码执行一些额外的工作(调整大小(两次)并转换为JPEG)。
但是,在下面的代码块完成并且我的图像被保存之后,程序抛出一个System.IO异常:“进程无法访问该文件,因为它正由另一个进程使用。”
protected void RadAsyncUpload1_FileUploaded(object sender, FileUploadedEventArgs e) {
ListViewItem lvwItem = lvwItems.EditItem;
RadAsyncUpload upl = (RadAsyncUpload)lvwItem.FindControl("RadAsyncUpload1");
string target = MapPath(upl.TargetFolder);
try
{
foreach (UploadedFile file in upl.UploadedFiles) {
using (Bitmap originalImage = new Bitmap(file.InputStream)) {
System.Drawing.Image cloneImage = (Bitmap)originalImage.Clone();
// Resize the picture to max 200 * 200
Size mySize = new Size(200, 200);
cloneImage = Imaging.resizeImage(originalImage, mySize);
// Create a bitmap from the cloned image. Bitmap is needed for saveJpeg routine
Bitmap newImage = new Bitmap(cloneImage);
// Convert to jpg if necessary
if (file.GetExtension() != ".jpeg" || file.GetExtension() != ".jpg") {
Imaging.saveJpeg(Path.Combine(target, file.GetNameWithoutExtension() + ".jpg"), newImage, 100);
}
else {
}
// Now create a thumbnail
Size thumbSize = new Size(50, 50);
cloneImage = Imaging.resizeImage(originalImage, thumbSize);
Bitmap thumbImage = new Bitmap(cloneImage);
Imaging.saveJpeg(Path.Combine(target, file.GetNameWithoutExtension() + "_lille.jpg"), thumbImage, 100);
uploadedFileName = file.GetNameWithoutExtension() + ".jpg";
}
}
}
catch (IOException ex)
{
}
}
此时,两个文件(200 * 200和50 * 50)将存在,但退出例程后,我收到错误。
我尝试关闭并处理所有图像以及file.InputStream,但仍然看到错误。我也试过看看UploadedFile是否可以被丢弃,但是没有找到存在的方法。
我很确定它有一个简单的解决方案,但我已经盯着这几个小时了,根本就没有看到它。
感谢。
答案 0 :(得分:3)
有关Imagaining Save方法MSDN page的评论:
将图像保存到其构造的同一文件中则不是 允许并抛出异常。
尝试使用其他名称保存您的文件。如果那是不可能的,你可以通过首先将文件读入内存来解决这个问题(例如,使用MemoryStream)。
答案 1 :(得分:2)
从任务栏中停止屏幕右下角的本地IIS服务器。
答案 2 :(得分:1)
事实证明我的错误是由行引起的:
using (Bitmap originalImage = new Bitmap(file.InputStream))
我将其替换为:
using (Stream fileStream = file.InputStream) {
using (System.Drawing.Image originalImage = System.Drawing.Image.FromStream(fileStream)) {
并且错误消失了。