FileUploadで複数のファイルをアップロードすると、「閉じられたファイルにアクセスできません」エラーの解決方法があります。
public static ArayList files変数を使って一時的にアップロードされたファイルを保存すると、ファイルが大きいと「閉じられたファイルにアクセスできません」というエラーが発生します。インターネット上にも多くの問題がありますが、解決策がありません。設定ファイルに追加
XML/XHTMLコード
<>
httpRuntime
execution Timeout
=「90」
maxRequest Length
=「2097151」
useFulyQualfiedirectUrl
=「false」
request LengthDiskThrehold
=「8192」
//
(属性「maxRequest Length」の値は0-2097151の範囲内でなければなりません。)一行後に、一部の問題を解決することができますが、完全に解決することはできません。このような問題が発生したコードはこう書きます。
ASPXコード
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コード
Cハハハコード
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"
/>
<
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"
/>
<
asp:Button
ID
="btnDelete"
runat
="server"
Text
=" "
OnClick
="btnDelete_Click"
/>
<
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);
}
}
}
}
}