2011-02-01 17 views
1

私はユーザーが画像をアップロードするために使用できるシンプルなフォームを持っています。プレビューボタンがあるので、ユーザーが画像を選択してプレビューをクリックするとポストバックが発生し、画像を一時フォルダに保存してサイズを変更してページに表示します。そこから、ユーザーはsubmit formまたはeditのいずれかのフォームを使用できます。彼が提出する場合、すべてが大丈夫です、私は正しいフォルダにサイズ変更されたイメージをコピーします。ファイルを上書き(イメージ)し、Cでイメージを削除しますか?

彼が編集をクリックすると、別の画像を選択した場合、私は(元とリサイズし両方)アップロードされたファイルを削除する必要があると私はこれを行う場合は、次の

File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + ".jpg")); 
File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_small_.jpg")); 

私が使用している他のプロセスを言って例外を取得します画像と削除できません。

また、そのファイルを削除する代わりに、同じ名前の新しいイメージを上書きするように保存しようとすると、ファイルがすでに存在するためにエラーがスローされます。

回数に制限は私がポストバック後に、ときに、ユーザー、また、(それもこれを行うには意味がありません)インクリメンタル

をファイルを保存傾けるように、ユーザーが/プレビューを編集することができますがありません編集モードに戻り、ファイルアップロードコントロールが空のフォームを表示します。どのように値を保持するために、ファイルのアップロードコントロールを取得できますか?他のすべてのテキストボックスとテキストエリアとチェックボックスは正しく動作します。

は、これらが私の質問です要約する:

1)どのように地球上の(というか、C#で)私はその例外を取得せずにファイルを削除することができますか?
または
1)ファイルの上書き方法
2)ファイルアップロードコントロールをポストバックの間にその値を保持する方法。

ありがとうございました。

答えて

1

例外は自分自身のために話しています:あなたのファイルはまだ起動している別のプロセス、つまりスレッドによって使用/開かれています。私はそれがあなたが読書のためにイメージファイルを開くプロセスであると確信しています。関連するストリームを閉じて、10ドルで問題を解決できることを確認してください。

+0

ここにその保存方法を示します: '' Bitmap img = new Bitmap(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_big.jpg")); ''どうすればこれを閉じるのですか? – IrishBelly

+0

私はそれが開かれていることを意味します。 '' upImage.SaveAs(...) ''を介してファイルアップロードコントロール経由で保存されました。 – IrishBelly

+0

はimg.Dispose()を使用しなければなりませんでした。 – IrishBelly

0

なぜビットマップを使用してサーバー側でファイルを開いていますか?

Response.TransmitFile(physicalFileNameAndPath)を使用して、単に「ファイル」をストリーミングする必要があります。

ここで、TransmitFileは物理ファイルのパスと名前を(文字列として)想定しています。

問題は、ファイルをクライアントに送信する方法に起因します。ファイルは、前の手順ではまだロックされています。これを修正すると、必要に応じてファイルを削除することができます。

私はFileUploadコントロールを使用していませんが、ViewStateを使用しているようです(これは、ポストバック後のフィールドの値を保持するのに役立ちます)。FileUploadコントロールはViewStateをサポートしていないか、 ViewStateを使用する場合は、FileUploadコントロールの必須のプロパティに正しい "値"を割り当てて、期待したことを示すことができます。これは、フォームがポストされたときに上記の値を取得し、DataBind中に値をFileUploadコントロールのプロパティに再割り当てするだけで済むことを意味します。

+0

こんにちは、ビットマップを使用してイメージを開いて、サイズを変更してからもう一度保存する必要があります。プレビューイメージに割り当てることができます。次に、サイズ変更されたイメージをメインディレクトリに保存し、一時フォルダ内のすべてのファイルを削除する必要があります。 – IrishBelly

+1

Bitmapインスタンスを破棄していますか?サイズ変更を行うために使用しているコードを表示できますか?問題は次のいずれかの分野にあります。 1 - アップロードしたファイルを保存する方法。 2 - 大きさを変えるためにあなたがそれを開く方法。 3 - あなたのサイズ変更された画像ファイルを保存する方法。 –

+0

明らかに、ファイルをサーバーからビットマップとして開くと、そのファイルにロックが作成されます。このファイルをファイルストリームとして開き、ビットマップからビットマップを作成し、編集後にファイルストリームを閉じることで、この作業を実行してください。 –

0
  1. 現在 のプロセスが書き込みのハンドルを持っていないことを確認してください 質問
  2. 内のファイルへのオープン一切のハンドルが存在しない場合は、お使いのウイルススキャナをオフに を試してみてください。 過度に攻撃的なウイルススキャナ は、作成したばかりのファイル にロックをかけている可能性があります。これにより、ファイルを削除できない可能性があります。
関連する問題