C# 文件总是空的

C# 文件总是空的,c#,asp.net,ajax,xmlhttprequest,C#,Asp.net,Ajax,Xmlhttprequest,我正在编写一个C#ASP.NETMVC应用程序,用于客户端将文件发布到其他服务器。我正在使用一个通用处理程序来处理从客户端到服务器的已发布文件。但在我的处理程序中,System.Web.HttpContext.Current.Request.Files始终为空(0计数) 表格编号: @model ITDB102.Models.UploadFileResultsModels @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div>

我正在编写一个C#ASP.NETMVC应用程序,用于客户端将文件发布到其他服务器。我正在使用一个通用处理程序来处理从客户端到服务器的已发布文件。但在我的处理程序中,System.Web.HttpContext.Current.Request.Files始终为空(0计数)

表格编号:

@model ITDB102.Models.UploadFileResultsModels
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div>
    <h1>Upload File</h1>
    <form id="file-form" action="/Files/UploadFile" method="post" data-ajax="false" enctype="multipart/form-data">
        <div><input type="file" id="FilePath" name="FilePath"/>
        <button type="submit">Send File</button></div>
    </form>
</div>

@section scripts{
    <script src="~/Scripts/jquery-1.10.2.js"></script>
    <script type="text/javascript">

        // Variable to store your files
        var files;
        var form = document.getElementById('file-form');

        // Add events
        $('input[type=file]').on('change', prepareUpload);

        // Grab the files and set them to our variable
        function prepareUpload(event) {
            files = $('#FilePath').get(0).files;
        }

        form.onsubmit = function (event) {
            uploadFiles(event);
        }

        // Catch the form submit and upload the files
        function uploadFiles(event) {
            event.stopPropagation(); // Stop stuff happening
            event.preventDefault(); // Totally stop stuff happening           

            // Create a formdata object and add the files
            var data = new FormData();
            if (files.lenght > 0)
            {
                data.append('UploadedFiles', files[0], file[0].name);
            }

            //setup request
            var xhr = new XMLHttpRequest();
            //open connection
            xhr.open('POST', '/Files/UploadFile',false);
            xhr.setRequestHeader("Content-Type", files.type);
            //send request
            xhr.send(data);

        }

    </script>

}
@model ITDB102.Models.UploadFileResultsModels
@{
Layout=“~/Views/Shared/_Layout.cshtml”;
}
上载文件
发送文件
@节脚本{
//变量来存储文件
var文件;
var form=document.getElementById('file-form');
//添加事件
$('input[type=file]')。在('change',prepareUpload)上;
//抓取文件并将其设置为我们的变量
函数prepareUpload(事件){
files=$('#FilePath').get(0).files;
}
form.onsubmit=函数(事件){
上传文件(事件);
}
//捕获表单提交并上载文件
函数上载文件(事件){
event.stopPropagation();//停止事件发生
event.preventDefault();//完全停止工作
//创建formdata对象并添加文件
var data=new FormData();
如果(files.lenght>0)
{
data.append('UploadedFiles',files[0],file[0].name);
}
//设置请求
var xhr=new XMLHttpRequest();
//开放连接
xhr.open('POST','/Files/UploadFile',false);
setRequestHeader(“内容类型”,files.Type);
//发送请求
发送(数据);
}
}
处理程序:

/// <summary>
    /// Uploads the file.
    /// </summary>
    /// <returns></returns>
    [HttpPost]
    public virtual ActionResult UploadFile()
    {
        HttpPostedFile myFile = System.Web.HttpContext.Current.Request.Files["UploadedFiles"];

        bool isUploaded = false;
        string message = "File upload failed";

        if (myFile != null && myFile.ContentLength != 0)
        {
            string pathForSaving = Server.MapPath("~/Uploads");
            if (this.CreateFolderIfNeeded(pathForSaving))
            {
                try
                {
                    myFile.SaveAs(Path.Combine(pathForSaving, myFile.FileName));
                    isUploaded = true;
                    message = "File uploaded successfully!";
                }
                catch (Exception ex)
                {
                    message = string.Format("File upload failed: {0}", ex.Message);
                }
            }
        }
        return Json(new { isUploaded = isUploaded, message = message }, "text/html");
    }


    #region Private Methods

    /// <summary>
    /// Creates the folder if needed.
    /// </summary>
    /// <param name="path">The path.</param>
    /// <returns></returns>
    private bool CreateFolderIfNeeded(string path)
    {
        bool result = true;
        if (!Directory.Exists(path))
        {
            try
            {
                Directory.CreateDirectory(path);
            }
            catch (Exception)
            {
                /*TODO: You must process this exception.*/
                result = false;
            }
        }
        return result;
    }

    #endregion
//
///上传文件。
/// 
/// 
[HttpPost]
公共虚拟操作结果上载文件()
{
HttpPostedFile myFile=System.Web.HttpContext.Current.Request.Files[“UploadedFiles”];
bool=false;
string message=“文件上传失败”;
if(myFile!=null&&myFile.ContentLength!=0)
{
字符串pathForSaving=Server.MapPath(“~/Uploads”);
如果(需要此.createFolderIfNeed(路径用于保存))
{
尝试
{
SaveAs(Path.Combine(pathForSaving,myFile.FileName));
isupload=true;
message=“文件上传成功!”;
}
捕获(例外情况除外)
{
message=string.Format(“文件上载失败:{0}”,例如message);
}
}
}
返回Json(新的{isupload=isupload,message=message},“text/html”);
}
#区域私有方法
/// 
///如果需要,创建文件夹。
/// 
///这条路。
/// 
私有布尔CreateFolderIfNeed(字符串路径)
{
布尔结果=真;
如果(!Directory.Exists(path))
{
尝试
{
CreateDirectory(路径);
}
捕获(例外)
{
/*TODO:您必须处理此异常*/
结果=假;
}
}
返回结果;
}
#端区

请帮帮我。谢谢。

要发布文件,发布数据必须为多部分/表单数据编码类型。因此,您必须按如下方式设置请求标头:

setRequestHeader(“内容类型”、“多部分/表单数据”)


请参见示例:

您需要为
xhr
设置以下内容

dataType: 'json',
contentType: false,
processData: false,
请参阅帮助链接-

我明白了,您已经包含了
jquery
库并使用了
jquery
选择器,那么为什么不使用
$.ajax
来处理
POST
请求呢?如果您对
jquery
方式感兴趣,下面是脚本

$.ajax({
  type: "POST",
  url: '/Files/UploadFile',
  data: data,
  dataType: 'json',
  contentType: false,
  processData: false,
  success: function(response) {
    alert('succes!!');
  },
  error: function(param1,param2,param3) {
    alert("errror");
  }
});

最后,我发现了问题所在

代码
var myFile=System.Web.HttpContext.Current.Request.Files[“UploadedFiles”]从未工作过。我的ajax没有问题。
我更改了控制器中的代码,如下所示,它现在可以工作了

[HttpPost]
    public virtual ActionResult UploadFile()
    {
        //var myFile = System.Web.HttpContext.Current.Request.Files["UploadedFiles"];
        //
        bool isUploaded = false;
        string message = "File upload failed";

        for (int i = 0; i < Request.Files.Count; i++ )
        {
            var myFile = Request.Files[i];

            if (myFile != null && myFile.ContentLength != 0)
            {
                string pathForSaving = Server.MapPath("~/Uploads");
                if (this.CreateFolderIfNeeded(pathForSaving))
                {
                    try
                    {
                        myFile.SaveAs(Path.Combine(pathForSaving, myFile.FileName));
                        isUploaded = true;
                        message = "File uploaded successfully!";
                    }
                    catch (Exception ex)
                    {
                        message = string.Format("File upload failed: {0}", ex.Message);
                    }
                }
            }

        }


        return Json(new { isUploaded = isUploaded, message = message }, "text/html");
    }

    #endregion

    #region Private Methods

    /// <summary>
    /// Creates the folder if needed.
    /// </summary>
    /// <param name="path">The path.</param>
    /// <returns></returns>
    private bool CreateFolderIfNeeded(string path)
    {
        bool result = true;
        if (!Directory.Exists(path))
        {
            try
            {
                Directory.CreateDirectory(path);
            }
            catch (Exception)
            {
                /*TODO: You must process this exception.*/
                result = false;
            }
        }
        return result;
    }

    #endregion

}
[HttpPost]
公共虚拟操作结果上载文件()
{
//var myFile=System.Web.HttpContext.Current.Request.Files[“UploadedFiles”];
//
bool=false;
string message=“文件上传失败”;
对于(int i=0;i
尝试了一下,但仍然不起作用。在我的表单头旁边已经包含了代码。我在一开始就使用了ajax版本,但它不起作用