`
61party
  • 浏览: 1114555 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

FileUpload上传多文件时出现“无法访问已关闭的文件”错误的解决方法

阅读更多

在使用 public static ArrayList files 变量保存临时上传的文件时,当文件比较大时,会出现“无法访问已关闭的文件”错误,网上也有很多这样的问题,但都没有解决办法。在配置文件中增加

XML/XHTML 代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><httpRuntime executionTimeout="90" maxRequestLength="2097151" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/>

(属性“maxRequestLength”值必须在 0-2097151 范围内。)一行之后,可以解决部分问题,但也不能彻底解决。出现这样的问题的代码是这样写的:

ASPX 代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="admin_Default3" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td align="right">
本地文件:
</td>
<td>
<asp:FileUpload ID="fupFile" runat="server" CssClass="btn" Width="247px" Height="20px"
onkeydown
="event.returnValue=false;" onpaste="return false" />
</td>
</tr>
<tr>
<td align="right">
文件列表:
</td>
<td valign="top">
<asp:ListBox ID="lbxFile" runat="server" Height="145px" Width="245px" CssClass="txt">
</asp:ListBox>
</td>
</tr>
<tr>
<td colspan="5">
<asp:Button ID="btnAdd" runat="server" Text="添加" OnClick="btnAdd_Click" />&nbsp;&nbsp;
<asp:Button ID="btnPost" runat="server" Text="上传" OnClick="btnPost_Click" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
C# 代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Collections;
using System.IO;

public partial class admin_Default3 : System.Web.UI.Page
{
public static ArrayList files = new ArrayList();
protected void btnAdd_Click(object sender, EventArgs e)
{
if (fupFile.HasFile)
{

ListItem item
= new ListItem();
item.Value
= item.Text = fupFile.PostedFile.FileName;
if (!lbxFile.Items.Contains(item))
{
lbxFile.Items.Add(item);
files.Add(fupFile);
}
else
Page.ClientScript.RegisterClientScriptBlock(
typeof(string), "", @"<script>alert('不能添加已经添加过的文件!')</script>");
}
}
protected void btnPost_Click(object sender, EventArgs e)
{
if (files.Count > 0)
{
if (!Directory.Exists(MapPath("../bodyissue/temp")))
Directory.CreateDirectory(MapPath(
"../bodyissue/temp"));


foreach (FileUpload fup in files)
{
if (fup.HasFile)

fup.SaveAs(MapPath(
"../bodyissue/temp") + "/" + fup.FileName);//无法访问已关闭的文件

}
Page.ClientScript.RegisterClientScriptBlock(
typeof(string), "", @"<script>alert('上传成功!')</script>");


}
}
}

要实现类似的功能,其实完全没有必要使用 static 变量,使用 static 变量,也会导致一些问题,因为 .NET 中 static 变量是所有线程共同使用的。下面的这个方法的代码,就解决这个问题。

ASPX 代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiFileUpload.aspx.cs"
Inherits
="MultiFileUplaod" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:HiddenField ID="allFileSize" runat="server" Value="0" />
<table>
<tr>
<td align="right">
本地文件:
</td>
<td>
<asp:FileUpload ID="FileUpload1" runat="server" />
</td>
</tr>
<tr>
<td align="right">
文件列表:
</td>
<td>
<asp:ListBox ID="lbxFile" runat="server" Height="145px" Width="245px" CssClass="txt">
</asp:ListBox>
</td>
</tr>
<tr>
<td colspan="2" style="text-align: center">
<asp:Button ID="btnAdd" runat="server" Text="添加文件" OnClick="btnAdd_Click" />&nbsp;&nbsp;
<asp:Button ID="btnDelete" runat="server" Text="删除文件" OnClick="btnDelete_Click" />&nbsp;&nbsp;
<asp:Button ID="btnPost" runat="server" Text="完成上传" OnClick="btnPost_Click" />
</td>
</tr>
</table>
</form>
</body>
</html>
C# 代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.IO;

public partial class MultiFileUplaod : System.Web.UI.Page
{
private String folder;
protected void Page_Load(object sender, EventArgs e)
{
folder
=Server.MapPath("~/temp");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
}
protected void btnAdd_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
String newFileName
= folder + "/" + Guid.NewGuid().ToString() + Path.GetExtension(FileUpload1.FileName);
int totalFileSize = Int32.Parse(allFileSize.Value);
int fileSize = FileUpload1.PostedFile.ContentLength;
//此处也可以限制单个文件的大小
if (totalFileSize + fileSize > 1024 * 1024)
{
Page.ClientScript.RegisterClientScriptBlock(
typeof(string), "", @"<script>alert('总上传的文件超过了大小设置1024 * 1024 !')</script>");
return;
}
FileUpload1.SaveAs(newFileName);
ListItem item
= new ListItem();
item.Text
= FileUpload1.FileName;
item.Value
= newFileName;
for (int i = 0; i < lbxFile.Items.Count; i++)
{
if (lbxFile.Items[i].Text.Equals(FileUpload1.FileName, StringComparison.InvariantCultureIgnoreCase))
{
Page.ClientScript.RegisterClientScriptBlock(
typeof(string), "", @"<script>alert('不能添加已经添加过的文件!')</script>");
return;
}
}
totalFileSize
+= fileSize;
allFileSize.Value
= totalFileSize.ToString();
lbxFile.Items.Add(item);
}
}
protected void btnPost_Click(object sender, EventArgs e)
{
//对上传的文件进行进一步处理,或者退出弹出窗口等操作
for (int i = lbxFile.Items.Count - 1; i > -1; i--)
{
lbxFile.Items.Remove(lbxFile.Items[i]);
}
Page.ClientScript.RegisterClientScriptBlock(
typeof(string), "", @"<script>alert('上传成功!')</script>");
}

protected void btnDelete_Click(object sender, EventArgs e)
{
for (int i = lbxFile.Items.Count - 1; i > -1; i--)
{
if (lbxFile.Items[i].Selected)
{
String value
= lbxFile.Items[i].Value;
lbxFile.Items.Remove(lbxFile.Items[i]);
if (File.Exists(value))
{
File.Delete(value);
}
}
}
}
}
分享到:
评论

相关推荐

    struts2.0的文件上传及下载

    4. **处理上传**:在`execute()`方法中,检查请求是否为多部分请求,然后解析请求以获取文件项。将文件保存到服务器上的指定位置,并返回相应的结果代码。 5. **表单设计**:在HTML或JSP页面上,使用`enctype=...

    commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar

    在处理文件上传时,`commons-fileupload`可能会依赖`commons-io`来完成一些底层的文件操作,比如读写文件、复制文件、检查文件是否存在等。`1.3.2`同样表示这个库的一个特定版本,它可能包含了更多的功能和改进。 ...

    文件上传及下载功能实现代码

    - 安全删除:在删除文件时,应确保文件已被完全关闭,避免数据丢失或损坏。 以上就是使用JSP实现文件上传和下载功能的主要步骤和知识点,结合Struts框架可以进一步提高代码的可维护性和扩展性。在实际开发中,还...

    commons-fileupload 以及示例

    在处理文件上传时,`commons-fileupload`可能会用到`commons-io`中的类进行文件操作,如读写文件、复制文件等。虽然`commons-fileupload`自身包含了基本的文件操作功能,但`commons-io`能为开发者提供更高级的功能和...

    java文件上传下载.doc

    本文将深入探讨这两个主题,并结合提供的博客链接(已无法访问,但通常这些资源会包含实用示例和解释)来阐述相关知识点。 **文件上传** 1. **HTTP协议**:文件上传通常是通过HTTP的POST请求实现的,特别是当表单...

    servlet上传文件(前)----得到http请求消息的内容

    确保在处理完文件后关闭输入流,并在出现异常时清理可能创建的临时文件。使用try-with-resources语句可以帮助自动关闭资源。 总结来说,通过Servlet实现文件上传需要理解HTTP请求的结构,利用`HttpServletRequest`...

    ASP.NET 上传下载文件

    - **GridView 控件**:显示数据记录,包括已上传的文件列表。 - **LinkButton 控件**:用于触发特定事件,如下载文件等。 ##### 1.2 数据库交互 - **数据库连接**:通过`SqlConnection`对象与数据库建立连接。 - **...

    Struts_UpAndDownFile【文件上传和下载】,文件上传和下载

    5. 编写Action类处理文件上传请求,使用`Commons FileUpload`库解析请求中的文件。 6. 存储文件到服务器指定位置。 ### 2. 文件下载 #### 2.1 概念与原理 文件下载是服务器将文件内容发送到客户端,供用户保存到...

    有关文件的上传-下载

    然后,使用`FileStream.Write`方法将二进制数据写入文件,并确保在完成后关闭文件流。 最后,这段代码似乎还准备将文件信息插入数据库,虽然具体实现(如`BZDownFileInfoManager`类)未在给出的内容中展示,但通常...

    Java组件commons fileupload实现文件上传功能

    【Java组件 Commons FileUpload 实现文件上传功能】 Apache Commons FileUpload 是一个强大的Java库,它使得在Servlet和JSP应用中处理文件上传变得极其简单。这个库提供了处理HTTP请求中的多部分/表单数据的能力,...

    Silverlight UI C# 后台 文件上传代码

    总结来说,实现Silverlight UI与C#后台的文件上传功能涉及前端UI设计、文件访问、异步通信、后台文件处理等多个环节。通过合理的架构设计和代码实现,可以为用户提供高效、安全的文件上传体验。

    java文件上传下载

    在Java Web开发中,文件上传和下载是常见的功能需求,特别是在构建交互性强的Web应用程序时。本篇文章将详细探讨如何使用Java实现文件的上传和下载功能。 首先,我们需要引入一个关键的库,即Apache Commons IO和...

    一个Struts2文件上传的源码

    JSP页面中的`&lt;form&gt;`标签定义了上传表单,其中`enctype="multipart/form-data"`属性至关重要,它告诉浏览器在发送请求时使用多部分编码方式,这是上传文件所必需的格式。`&lt;input type="file"&gt;`元素用于选择文件,而`...

    文件上传和下载包

    在JavaWeb开发中,文件上传和下载是两个非常重要的功能,它们使得用户可以在网页上交互地处理本地文件。本包提供了实现这些功能所需的类库和工具,解压后即可直接应用到项目中。 1. **文件上传** - **Servlet API*...

    Struts2文件下载程序使用框架实现

    例如,可以设置文件访问权限,对下载路径进行加密,或者通过Action进行用户身份验证。 在实际开发中,Struts2提供了丰富的插件和配置选项来辅助实现文件下载。例如,可以使用Struts2的FileUpload插件来处理上传的...

    struts 操作文件上传下载

    3. **ActionForm处理**:在Struts的`execute()`方法中,可以通过`FormFile`对象访问上传的文件信息,如文件名、大小等。 4. **文件保存**:将接收到的文件保存到服务器的指定目录,通常需要考虑文件重命名、大小...

    Struts2 上传和下载功能

    5. **关闭资源**:确保在完成后关闭文件流。 在开发过程中,你可能会遇到一些常见问题,如文件名编码问题、文件大小限制、安全性考虑等。文件上传时,应确保文件大小有限制以防止DoS攻击,并进行文件类型的检查,...

    文件上传下载【struts2】

    例如,可以通过自定义拦截器来限制上传文件的大小,或者使用安全库如Apache Commons FileUpload来处理文件上传,以防止恶意文件注入。同时,确保文件名的编码处理正确,避免路径遍历攻击等安全问题。最后,对下载的...

    struts上传和下载源码

    需要记录文件的大小和已下载的部分,以便在请求时根据这些信息提供正确的文件部分。 三、注意事项 1. **安全性**: 文件上传时需验证文件类型、大小,防止恶意文件上传。对于下载,确保只允许访问指定的、安全的...

    java 上传下载功能例子 连接MSQL数据库

    在Java编程中,实现文件上传和下载功能是常见的需求,特别是在构建Web应用时。这个例子提供了这样一个功能,并结合了MySQL数据库进行数据交互。下面将详细解释这个例子中的关键知识点。 1. **Java文件操作**: - ...

Global site tag (gtag.js) - Google Analytics