Asp.net mvc 3 如何通过ajax上传文件

Asp.net mvc 3 如何通过ajax上传文件,asp.net-mvc-3,jquery,file-upload,upload,Asp.net Mvc 3,Jquery,File Upload,Upload,我有文件上传,它不使用表单上传文件,而是我想使用ajax上传文件。我尝试了以下方法,但无法传递文件。它是空的。请帮忙。下面是我的实现 HTML和jQuery函数 <div id="Upload"> <input type="file" accept="application/x-shockwave-flash" id="virtualtourfile" enctype="multipart/form-data"/> <input type="butt

我有文件上传,它不使用表单上传文件,而是我想使用ajax上传文件。我尝试了以下方法,但无法传递文件。它是空的。请帮忙。下面是我的实现

HTML和jQuery函数

<div id="Upload">
    <input type="file" accept="application/x-shockwave-flash" id="virtualtourfile" enctype="multipart/form-data"/>
    <input type="button" value="Upload" id="btnUpload"/>
</div>

$('#btnUpload').click(function () {
            $.ajax({
                url: "uploadvideo",
                type:'POST',
                data: $("#virtualtourfile:file"),
                success: function (data) {

                }
            });
        });

有两种选择。如果客户端浏览器支持,则可以使用它将文件异步上载到服务器。如果您需要支持不支持此API的传统浏览器,则可以使用文件上载组件,例如。。。这些插件的优点是,它们将测试浏览器的功能,如果它支持文件API,它将使用它,否则它将退回到旧技术,如隐藏iFrame或Flash电影。

我使用了一些插件,我发现剑道UI上传插件很不错,下面是它的工作原理链接:

您可以在此处找到Asp.Net MVC 3的示例项目:

[HttpPost]
公共操作结果保存(IEnumerable附件)
{
//上载组件的名称为“附件”
foreach(附件中的var文件)
{
//有些浏览器发送带有完整路径的文件名。这需要删除。
var fileName=Path.GetFileName(file.fileName);
var physicalPath=Path.Combine(Server.MapPath(“~/App\u Data”),文件名);
file.SaveAs(物理路径);
}
//返回一个空字符串表示成功
返回内容(“”);
}

您可以使用jQuery文件上传来实现这一点。演示、下载和文档可访问。在服务器端,您的MVC代码可以像处理常规上载一样处理文件上载。您是否在特定浏览器上面临此问题?@Pankaj Garg no。所有浏览器都是如此。您是否尝试添加
contentType:'application/json;charset=utf-8',
数据:JSON.stringify($(“#virtualtourfile:file”),
?@Pankaj-Garg是的,我做了。它仍然是空的。我认为如果不按照下面的开发者的建议使用插件是不可能的
public ActionResult UploadVideo(HttpPostedFileBase file)
        {
            return Json("", JsonRequestBehavior.AllowGet);
        }
        [HttpPost]
        public ActionResult Save(IEnumerable<HttpPostedFileBase> attachments)
        {
            // The Name of the Upload component is "attachments" 
            foreach (var file in attachments)
            {
                // Some browsers send file names with full path. This needs to be stripped.
                var fileName = Path.GetFileName(file.FileName);
                var physicalPath = Path.Combine(Server.MapPath("~/App_Data"), fileName);

                file.SaveAs(physicalPath);
            }
            // Return an empty string to signify success
            return Content("");
        }