1

私のプログラムは Telerik ASyncUpload コントロールを使用して、ユーザーが画像をアップロードできるようにします。コントロールは画像のみを受け入れるように構成されており、その FileUploaded イベントには、いくつかの追加作業 (サイズ変更 (2 回) と 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) 
        {

        }
    }

この時点で、2 つのファイル (200*200 と 50*50) が存在しますが、ルーチンを終了するとエラーが発生します。

すべての画像と file.InputStream を閉じて破棄しようとしましたが、それでもエラーが表示されます。また、 UploadedFile を破棄できるかどうかも調べてみましたが、そのメソッドが存在することがわかりませんでした。

簡単な解決策があることは確かですが、私はこれを何時間も見つめていましたが、単にそれが見えません。

ありがとう。

4

3 に答える 3

3

Imagaining Save method MSDN pageにコメントがあります:

イメージを作成元と同じファイルに保存することは許可されておらず、例外がスローされます。

ファイルを別の名前で保存してみてください。それが不可能な場合は、最初にファイルをメモリに読み込むことでこれを回避できます (fe MemoryStream を使用)。

于 2012-08-07T06:20:10.853 に答える
2

画面の右下隅のタスクバーから、ローカルの IIS サーバーを停止します。

于 2013-08-03T07:30:55.087 に答える
1

私のエラーは次の行が原因であることがわかりました。

using (Bitmap originalImage = new Bitmap(file.InputStream))

私はそれを次のように置き換えました:

using (Stream fileStream = file.InputStream) {
   using (System.Drawing.Image originalImage = System.Drawing.Image.FromStream(fileStream)) {

エラーはなくなりました。

于 2012-08-07T19:21:58.977 に答える