5

我遇到的问题是在<input type=file>不使用 a的情况下从 a 获取文件信息<form>到代码隐藏方法中。当我尝试使用获取信息时,该文件始终在后面的代码中返回为 null,Request.Files我相信这是因为它实际上从未被发送到服务器。

有没有办法在不使用 a 的情况下将文件信息发送到服务器<form>

这是我正在使用的html
<input type="file" id="upload_file" name="upload_file" runat="server" accept="image/*" onchange="copyFile()" />

这是背后的代码
HttpPostedFile file = Request.Files["upload_file"];

    if (file != null && file.ContentLength > 0)
    {
        string fname = Path.GetFileName(file.FileName);
        file.SaveAs(Server.MapPath(Path.Combine("~/App_Data/", fname)));
    }

由于网页的设置方式,我无法使用 a <form>,它仅在 IE(甚至 IE9)中导致一些可怕的格式问题,我无法在 css 中修复。另外,我正在使用<input type=file>而不是,<asp:FileUpload>以便我可以访问该onchange事件。

编辑!
在隐藏在网站内的母版页上,有一个已经添加了 runat="server" 的表单。抱歉之前没有提到这一点,我只是在尝试将 runat="server" 添加到我尝试创建的新表单时才发现

任何帮助将不胜感激!谢谢!

编辑!
最终代码
感谢@bkwint 和@TrizZz,如果没有你的帮助,我仍然会努力解决这个问题。

html部分

<asp:FileUpload id="upload_file" runat="server" OnLoad="upload_file_OnLoad" />

后面的代码在 onchange 中添加到 asp:FileUpload

protected void upload_file_OnLoad(object sender, EventArgs e) { ((System.Web.UI.WebControls.FileUpload)sender).Attributes.Add("onchange", "copyFile();"); }

以及保存文件的代码

if (Request.Files.Count > 0) { if (Request.Files[0].FileName.Length > 0) { Request.Files[0].SaveAs("~/App_Data/" + Request.Files[0].FileName); } }

javascript 允许我使用母版页中的表单进行提交,其中添加了添加到 asp:FileUpload 的 onchange。id 'aspnetForm' 是母版页中的表单。

document.getElementById('aspnetForm').submit();

从我通过更多研究了解到的情况是,可能导致 css 不满意并且表单无法正确提交的原因是嵌套表单不好。由于母版页上有一个我不知道的表单,所以当我添加另一个表单时,网页只是有点忽略了我添加的那个。通过调用母版页上的提交,将上传的文件正确推送到服务器。

再次感谢所有回复/评论和帮助的人!

注意
这在 IE 中可能不起作用,具体取决于您的设置方式。当您尝试直接从文件上传提交表单时,IE 不喜欢它。

4

2 回答 2

2

你需要一个表单来使用表单控件。我知道你说你有一些 CSS 问题,但是如果它导致问题,你将能够处理你的 CSS。


HttmpPostedFile 仅在提交时发布,这就是您获得 NULL 文件的原因。需要表单来获取 post 方法。文件仅在邮寄期间发送,您需要这样做:

<form action="yourPage.aspx" method="post">
<input type="file" onchange="this.form.submit()" name="upload_file" id="upload_file"/>
</form>

在 yourPage.aspx 的加载事件中:

HttpPostedFile file = Request.Files["upload_file"];
if (file != null && file.ContentLength > 0)
{
    string fname = Path.GetFileName(file.FileName);
    file.SaveAs(Server.MapPath(Path.Combine("~/App_Data/", fname)));
}

使用这种方法,你应该没有问题,当然除了你的 CSS

于 2012-08-22T13:14:40.020 回答
1

您的文件输入应放在表单中。据我所知,没有办法将其保留在表单标签之外并仍然发送数据......

至于使用标签而不是 dot net FileUpload 标签的原因。为什么不在后端添加 onchange javascript。

所以像这样定义你的标签

<asp:FileUpload ID="FlUpld_x" runat="server" OnLoad="FlUpld_x_OnLoad" />

并像这样定义你的代码

protected void FlUpld_x_OnLoad(object sender, EventArgs e)
{
  ((FileUpload)sender).Attributes.Add("onchange", "js_function();");
}
于 2012-08-22T12:55:54.760 回答