我有一个简单的表单,用户可以使用它来上传图像。它有一个预览按钮,因此当用户选择图像并单击预览时,会发生回发,并将图像保存到临时文件夹并调整大小并在页面上显示。从那里,用户可以submit form
或edit
表单。如果他提交,一切都没问题,我将调整后的图像复制到正确的文件夹中。
如果他点击了编辑,并选择了另一张图片,我需要删除上传的文件(原件和调整大小),如果我这样做:
File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + ".jpg"));
File.Delete(HostingEnvironment.MapPath(TmpDirectory + PostImageName + "_small_.jpg"));
我得到一个异常,说其他一些进程正在使用该图像而且它无法删除。 (甚至在回发后!)
并且,如果我尝试使用相同的名称保存新图像而不是删除该文件,以便它将覆盖,它仍然会抛出错误,因为文件已经存在。
用户可以编辑/预览的次数没有限制,因此我无法逐步保存文件(这样做甚至没有意义)
此外,在回发之后,当用户返回编辑模式并查看表单时,文件上载控件为空。如何获取文件上传控件以保留该值?所有其他文本框和文本区域和复选框都表现正常。
总结这些是我的问题:
1)如何在没有获得该异常的情况下删除文件(或者更确切地说,在c#中)?
或
1)如何覆盖文件?
2)如何使文件上传控件在回发之间保持其值。
感谢。
答案 0 :(得分:1)
异常说明:您的文件仍然被您启动的另一个进程(即线程)使用/打开。我敢打赌,这是打开图像文件进行阅读的过程。确保你关闭了相关的流,10块钱可以解决你的问题。
答案 1 :(得分:0)
为什么使用Bitmap在服务器端打开文件?您应该使用
简单地流式传输“文件”Response.TransmitFile(physicalFileNameAndPath)。
其中TransmitFile期望(作为字符串)物理文件路径和名称。
问题源于您将文件发送到客户端的方式。该文件仍然被上一步“锁定”。如果您解决此问题,您将能够在需要时删除该文件。
我没有使用过FileUpload控件,但看起来你正在使用ViewState(这有助于在回发后保留字段中的值。要么FileUpload控件不支持ViewState,要么你没有将它配置为使用ViewState。
您可以使用正确的“值”分配FileUpload控件的必需属性,以便显示您所期望的内容。这意味着您必须在发布表单时捕获所述值,并在DataBind期间将值重新分配回FileUpload控件的属性。
答案 2 :(得分:0)