På aspx sidan har jag en dropdown där man kan välja antal och en panel som jag skapar htmlInputfile i. Jag vet inte exakt hur du ska lösa det men jag kan ge en hint om vad som är fel: Jag gjorde en sida med 5 fält. Sen när jag kör uppladdningen kör jagLadda upp flera filer
<code>
asp:dropdownlist id="ddlAntal" runat="server" autopostback="True" onselectedindexchanged="skapa">
<asp:listitem value="" selected="True"> </asp:listitem>
<asp:listitem value="3">3</asp:listitem>
</asp:dropdownlist>
<asp:panel id="plMb" runat="server" />
<asp:button id="btupload" runat="server" onclick="upload" />
</code>
Sen har jag den här koden som skapar input fälten
<code>
Protected WithEvents tbBild1 As System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents tbBild2 As System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents tbBild3 As System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents tbBild4 As System.Web.UI.HtmlControls.HtmlInputFile
Protected WithEvents tbBild5 As System.Web.UI.HtmlControls.HtmlInputFile
Public Sub skapa(ByVal sender As Object, ByVal e As EventArgs)
Dim i As Integer
Dim pl As New Panel()
For i = 1 To 3
Dim tbl As New Table()
Dim tblr As New TableRow()
Dim tblc As New TableCell()
Dim tbBild As New System.Web.UI.HtmlControls.HtmlInputFile()
tbBild.ID = "tbBild" & i
tblc.Controls.Add(tbBild)
tblr.Cells.Add(tblc)
tbl.Rows.Add(tblr)
pl.Controls.Add(tbl)
Next
plMb.Controls.Add(pl)
End Sub
Public Sub upload(ByVal sender As Object, ByVal e As EventArgs)
Dim i As Integer
For i = 1 To 3
Dim upl As String
Dim bild As String = Request.Params("tbBild" & i.ToString())
Dim m_ID As Integer = viewstate("matchID")
Dim strFileName As String
Dim strFilePath As String
Dim strFolder As String
Dim nBild As String
strFolder = "e:\ww2\[url]www.tibroik.com\www\matchBilder\[/url]"
'Get the name of the file that is posted.
If i = 1 Then
tbBild1 = Page.FindControl("tbbild1")
strFileName = tbBild1.PostedFile.FileName
ElseIf i = 2 Then
strFileName = tbBild2.PostedFile.FileName
ElseIf i = 3 Then
strFileName = tbBild3.PostedFile.FileName
ElseIf i = 4 Then
strFileName = tbBild4.PostedFile.FileName
ElseIf i = 5 Then
strFileName = tbBild5.PostedFile.FileName
End If
strFileName = Path.GetFileName(strFileName)
'Create the directory if it does not exist.
If (Not Directory.Exists(strFolder)) Then
Directory.CreateDirectory(strFolder)
End If
'Save the uploaded file to the server.
strFilePath = strFolder & strFileName
If File.Exists(strFilePath) Then
lblUploadResult.Text = "<span style=""color:#ff0000"">" & strFileName & " Finns redan på servern. Byt namn på bilden eller välj bilden i arkivet!</span><br />"
Else
Dim OldName, NewName As String
OldName = strFilePath
NewName = viewstate("match") & "_" & DateTime.Now.ToString("t") & "_" & i
nBild = viewstate("match") & "_" & DateTime.Now.ToString("t") & "_" & i
If i = 1 Then
tbBild1.PostedFile.SaveAs(strFilePath)
ElseIf i = 2 Then
tbBild2.PostedFile.SaveAs(strFilePath)
ElseIf i = 3 Then
tbBild3.PostedFile.SaveAs(strFilePath)
ElseIf i = 4 Then
tbBild4.PostedFile.SaveAs(strFilePath)
ElseIf i = 5 Then
tbBild5.PostedFile.SaveAs(strFilePath)
End If
Rename(OldName, NewName)
lblUploadResult.Text = "<span style=""color:#3D6F0D"">" & strFileName & " Upplagd på servern.</span><br />"
End If
Next
End Sub
</code>
När jag trycker på knappen får jag det här felet
<code>
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 69: If i = 1 Then
Line 70: tbBild1 = Page.FindControl("tbbild1")
Line 71: strFileName = tbBild1.PostedFile.FileName
Line 72: ElseIf i = 2 Then
Line 73: strFileName = tbBild2.PostedFile.FileName
Source File: d:\inetpub\wwwroot\tibroik.net\admin2\upload.aspx.vb Line: 71
</code>
Är det någon som vet varför jag får det felet. Input fälten finns på sidan.
Är det någon som har en bättre lösning?Sv: Ladda upp flera filer
Kontrollerna skapas dynamiskt och finns därför inte om inte om inte din "skapa" funktion har körts när sidan laddas!
Dina fem "protected withevents tbBildX" kan du skippa. Dom har ingen funktion om du inte har själva fältet i aspx-sidan.
Jag vet inte hur din body_load funktion ser ut, men stoppa in typ
if ddlAntal.SelectedIndex > 0 then
skapa()
end if
så att filrutorna alltid skapas om du har valt något antal...
Eller så kan du köra med visible=false på alla filrutorna och bara visa 3 stycken om man väljer att man vill ladda upp 3 filer...
Eller så kan du köra med gammal hederlig request.form() och en upload-komponent
Skäll inte på mig om jag är helt ute och cyklar... =)
Jag har löst liknande problem med dynamiska objekt, fast det var knappar med click-events på så jag är inte säker på hur man löser file-fält...
/Johan - Ny på .netSv: Ladda upp flera filer
for i = 1 to 5
Och sen kollar jag om tex if bildfält 2 är tomt then
exit for
Detta kanske inte är den smartaste lösningen men det fungerar