0

我有一个文件上传控件,允许用户上传图像文件。我没有强迫他们使用特定尺寸的图像,而是尝试调整它的大小,将调整后的版本保存到文件夹中,然后删除原始图像。

当我尝试删除文件时,我不断收到“文件正在使用”异常。我搜索并尝试了所有建议均无济于事。

这是最新的尝试,此时我决定寻求帮助。我传递了源路径(原始文件所在的位置、调整大小的文件最终所在的目标路径、应该调整大小的文件名和宽度,保持纵横比):

public static void CreateResizedCopy(String sourcePath, String destinationPath, String filename, int width)
{
    if (!File.Exists(destinationPath + filename))
    {
        System.Drawing.Image image = System.Drawing.Image.FromFile(sourcePath + filename);
        float AspectRatio = (float)image.Size.Width / (float)image.Size.Height;
        int newHeight = Convert.ToInt32(width / AspectRatio);
        Bitmap thumbnailBitmap = new Bitmap(width, newHeight);
        Graphics thumbnailGraph = Graphics.FromImage(thumbnailBitmap);
        thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality;
        thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality;
        thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
        var imageRectangle = new Rectangle(0, 0, width, newHeight);
        thumbnailGraph.DrawImage(image, imageRectangle);
        thumbnailBitmap.Save(destinationPath + filename, ImageFormat.Jpeg);
        thumbnailGraph.Dispose();
        thumbnailBitmap.Dispose();
        image.Dispose();

        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();

        if (!FileInUse(sourcePath + filename))
        {
            File.Delete(sourcePath + filename);
        }
        else
        {
            // Error here: file is in use
            using (FileStream fs = new FileStream(sourcePath + filename, FileMode.OpenOrCreate))
                fs.Dispose();
        }
    }
}

public static bool FileInUse(string path)
{
    try
    {
        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
        {
            return false;
        }
    }
    catch (IOException ex)
    {
        return true;
    }
}

更新 这是 AJAX AsynFileUpload 的上传完成事件处理程序。它将文件保存到“调整大小”文件夹。如果图像需要调整大小,它会调用该方法来调整它的大小,然后将其移动到最终的静止位置。如果没有,则不调整大小,它只是移动文件。然后它“尝试”删除 resize 文件夹中的文件,它会窒息!

protected void fuNewsImage_UploadedComplete_Resize(object sender, AsyncFileUploadEventArgs e)
{
    if (fuNewsImage.HasFile)
    {
        HttpPostedFile file = fuNewsImage.PostedFile;
        string sFileName = fuNewsImage.FileName;
        string sFileSize = e.FileSize;

        string sSaveFolder = ImageFilePath.TEMP_FOLDER_EA_TEST + "\\";
        string sResizeFolder = ImageFilePath.TEMP_FOLDER_EA_TEST + "\\Resized\\";

        fuNewsImage.SaveAs(Server.MapPath(sResizeFolder + sFileName));
        System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(sResizeFolder) + sFileName);
        int iImgWidth = img.Width;
        int iImgHeight = img.Height;

        if (iImgWidth > ImageInfo.MAX_WIDTH)
        {
            // sSaveFolder is the efinal resting place of the uploaded image
            // If image width is more than max allowed, resize it, save it in sSaveFolder
            Utils.CreateResizedCopy(Server.MapPath(sResizeFolder), Server.MapPath(sSaveFolder), sFileName, 600);

            System.Threading.Thread.Sleep(1000);
            File.Delete(Server.MapPath(sSaveFolder + sFileName));
        }
        else  // just move it t sSaveFolder
        {
            File.Move(Server.MapPath(sResizeFolder) + sFileName, Server.MapPath(sSaveFolder) + sFileName);
        }
        //        ---  Chokes here  ---
        Array.ForEach(Directory.GetFiles(Server.MapPath(sResizeFolder)), File.Delete);
    }
}
4

0 回答 0