我正在尝试使用用户控制页面内的文件上传控件将文件上传到数据库。上传文件时,我收到一个错误,即控件中没有选择文件。
我在网上搜索了解决方案,我发现我需要为处理上传代码的按钮添加一个触发器。我还读到我需要添加Page.Form.Attributes.Add("enctype", "multipart/form-data")
。在我的情况下似乎没有工作。
aspx文件:
<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" CodeFile="Sessions.aspx.vb" Inherits="Sessions" %>
<%@ Register Src="~/Controls/SessionCtl.ascx" TagName="SessionCtl" TagPrefix="uc2" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel runat="server" ID="pnlAddUpdateSession" Visible="false">
<div style="width: 900px; margin-left: auto; margin-right: auto; margin-top: 20px;">
<uc2:SessionCtl runat="server" ID="sessionCtl" />
</div>
</asp:Panel>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnAddSession" />
</Triggers>
</asp:UpdatePanel>
</asp:Content>
ascx文件:
<asp:Panel ID="panelAddUpdate" runat="server" GroupingText="Add session" Width="95%" CssClass="PanelADD">
<div id="pnlFileUploadArea" style="align-content: center" class="gvProject">
<asp:Label ID="label12" Text="Add Log:" runat="server"></asp:Label>
<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow" AutoPostBack="True">
<asp:ListItem Text="New" Value="0" Selected="True"></asp:ListItem>
<asp:ListItem Text="Use Previous" Value="1"></asp:ListItem>
</asp:RadioButtonList>
<br />
<div id="fileUploadContainer" runat="server">
<div id="fileUploadControl">
<asp:FileUpload ID="fuSelectedFile" runat="server"size="60"/>
</div>
</div>
<br />
<br />
</div>
<div style="padding: 5px 5px 5px 25px">
<asp:Button ID="btnAddSession" runat="server" Text="Add" SkinID="fancybutton" />
<asp:Button ID="btnCancelAddSession" runat="server" Text="Cancel" SkinID="fancybutton" />
</div>
</asp:Panel>
ascx.vb文件:
Protected Sub btnAddSession_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddSession.Click
If (String.IsNullOrEmpty(validationMessage)) Then
'validationMessage is a var I use to check if other fields are filled correctly
If (RadioButtonList1.Items.FindByText("New").Selected = True) Then
If Not (fuSelectedFile.HasFile) Then
'upload files
Else
validationMessage = "No file selected!"
End If
End If
End If
End Sub
aspx.vb文件:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Form.Attributes.Add("enctype", "multipart/form-data")
End Sub
答案 0 :(得分:1)
您可以尝试
ascx文件
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload"
OnClick="btnUpload_Click" />
<br />
<asp:Label ID="lblMessage" runat="server" Text=""
Font-Names = "Arial"></asp:Label>
<强> ascx.cs 强>
按钮上传活动
protected void btnUpload_Click(object sender, EventArgs e)
{
// Read the file and convert it to Byte Array
string filePath = FileUpload1.PostedFile.FileName;
string filename = Path.GetFileName(filePath);
string ext = Path.GetExtension(filename);
string contenttype = String.Empty;
//Set the contenttype based on File Extension
switch(ext)
{
case ".doc":
contenttype = "application/vnd.ms-word";
break;
case ".docx":
contenttype = "application/vnd.ms-word";
break;
case ".xls":
contenttype = "application/vnd.ms-excel";
break;
case ".xlsx":
contenttype = "application/vnd.ms-excel";
break;
case ".jpg":
contenttype = "image/jpg";
break;
case ".png":
contenttype = "image/png";
break;
case ".gif":
contenttype = "image/gif";
break;
case ".pdf":
contenttype = "application/pdf";
break;
}
if (contenttype != String.Empty)
{
Stream fs = FileUpload1.PostedFile.InputStream;
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
//insert the file into database
string strQuery = "insert into tblFiles(Name, ContentType, Data)" +
" values (@Name, @ContentType, @Data)";
SqlCommand cmd = new SqlCommand(strQuery);
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = filename;
cmd.Parameters.Add("@ContentType", SqlDbType.VarChar).Value
= contenttype;
cmd.Parameters.Add("@Data", SqlDbType.Binary).Value = bytes;
InsertUpdateData(cmd);
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Text = "File Uploaded Successfully";
}
else
{
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Text = "File format not recognised." +
" Upload Image/Word/PDF/Excel formats";
}
}
<强>更新强>
private Boolean InsertUpdateData(SqlCommand cmd)
{
String strConnString = System.Configuration.ConfigurationManager
.ConnectionStrings["conString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
Response.Write(ex.Message);
return false;
}
finally
{
con.Close();
con.Dispose();
}
}
答案 1 :(得分:0)
我通过这样做得到了它:
If (String.IsNullOrEmpty(validationMessage)) Then
cmd = New SqlCommand("", conn)
Dim imageData As Byte()
Dim sFilePath As String = fuSelectedFile.PostedFile.FileName
Dim ext As String = Path.GetExtension(sFilePath)
Dim sFileName As String
Dim sFileType As String
'upload file to DB
If (RadioButtonList1.SelectedValue = "0") Then
If Not String.IsNullOrEmpty(sFilePath) Then
If (ext = ".jpeg" Or ext = ".pdf" Or ext = ".jpg") Then
Try
'Read Image Bytes into a byte array
'Initialize SQL Server Connection
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
'Convert File to bytes Array
'Initialize byte array with a null value initially.
Dim data As Byte() = Nothing
'Use FileInfo object to get file size.
Dim fInfo As New FileInfo(sFilePath)
Dim numBytes As Long = fInfo.Length
'Open FileStream to read file
Dim fStream As New FileStream(sFilePath, FileMode.Open, FileAccess.Read)
'Use BinaryReader to read file stream into byte array.
Dim br As New BinaryReader(fStream)
'When you use BinaryReader, you need to supply number of bytes to read from file.
'In this case we want to read entire file. So supplying total number of bytes.
imageData = br.ReadBytes(CInt(numBytes))
sFileName = System.IO.Path.GetFileName(sFilePath)
sFileType = System.IO.Path.GetExtension(sFilePath)
'Set insert query
'Execute the Query
cmd.ExecuteNonQuery()
Catch ex As Exception
validationMessage = "The file could not be uploaded. The following error occured: " & ex.Message
Console.WriteLine(ex.Message)
End Try
Else
validationMessage = "Jpeg or PDF files only!"
End If
Else
validationMessage = "No file selected!"
End If
End If
End If