我的程序使用Telerik ASyncUpload控件来允许用户上传图像。该控件已配置为仅接受图像,并且在其 FileUpload 事件中,有一些额外的代码执行一些额外的工作(调整大小(两次)并转换为 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)将存在,但在退出例程时,我收到错误。
我尝试关闭和处理所有图像以及文件。输入流,但仍会看到错误。我还尝试查看是否可以丢弃上传文件,但没有发现该方法存在。
我相当确定有一个简单的解决方案,但我已经盯着这个几个小时了,根本没有看到它。
谢谢。
在 Imagaining Save 方法 MSDN 页上有一个注释:
将图像保存到构建它的同一文件中不是 允许并引发异常。
尝试使用其他名称保存您的文件。如果这是不可能的,你可以通过先将文件读取到内存(即使用内存流)来解决此问题。
从屏幕右下角的任务栏停止本地 IIS 服务器。
事实证明,我的错误是由以下行引起的:
using (Bitmap originalImage = new Bitmap(file.InputStream))
我用以下方式替换了它:
using (Stream fileStream = file.InputStream) {
using (System.Drawing.Image originalImage = System.Drawing.Image.FromStream(fileStream)) {
并且错误消失了。