FileUploadで複数のファイルをアップロードすると、「閉じられたファイルにアクセスできません」エラーの解決方法があります。


public static ArayList files変数を使って一時的にアップロードされたファイルを保存すると、ファイルが大きいと「閉じられたファイルにアクセスできません」というエラーが発生します。インターネット上にも多くの問題がありますが、解決策がありません。設定ファイルに追加
XML/XHTMLコード
<>
httpRuntime
execution Timeout
=「90」
maxRequest Length
=「2097151」
useFulyQualfiedirectUrl
=「false」
request LengthDiskThrehold
=「8192」
//
(属性「maxRequest Length」の値は0-2097151の範囲内でなければなりません。)一行後に、一部の問題を解決することができますが、完全に解決することはできません。このような問題が発生したコードはこう書きます。 
ASPXコード
<% @ 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ハハハコード
using
System;
using
System.Collections.Generaic;
using
System.Linkq
using
System.Web
using
System.Web.UI
using
System.Web.UU.WebControls;
using
System.Collections
using
System.IO
public
パーティー
クラス
admin_Default 3:System.Web.UID.Page{    
public
static
ArayList files
を選択します。
new
ArayList()    
protected
void
btnAdd Click(
object
sender,EventArgs e)    {        
if
(fup File.Has File)        {            ListItem item
を選択します。
new
ListItem();            item.Value
を選択します。
item.Text
を選択します。
FpFile.PostedFile.FileName;            
if
(

lbxFile.Items.Contins(item)            {                lbxFile.Items.Add(item)                files.Add;            }            
else
                Page.Client Script.Register Cient Script Block(
typeof
(
ストリングス
を選択します
「」
を選択します
@「
<script>alert('は既に追加されたファイルを追加できません!')

)0        }    }    
protected
void
btnPost Click(
object
sender,EventArgs e)    {        
if
(files.sont
>
0
)        {            
if
(

Directory.Exists(MapPath)

./bodyissue/temp

)                Directory.reat Directory(MapPath)

./bodyissue/temp

)[形            
foreach
(FileUpload fup
in
files            {                
if
(fup.Has File)                    fup.SaveAs(MapPath)

./bodyissue/temp

)


を選択します。


fup.FileName)
//
閉じられたファイルにアクセスできませんでした。
            }            Page.Client Script.Register Cient Script Block(
typeof
(
ストリングス
を選択します
「」
を選択します
@「
<スクリプト>alert('アップロード成功!')

)0        }    }}
このような機能を実現するには、static変数を使う必要は全くありません。static変数を使うと、問題が発生します。NETのstatic変数はすべてのスレッドが共同で使うものです。以下のこの方法のコードはこの問題を解決します。
ASPXコード
<% @ 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ハハハコード
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);
                }
            }
        }
    }
}