我在这里找到了这个ajax文件上传脚本http://www.phpletter.com/Demo/AjaxFileUpload-Demo/
应该在我的文件上传表单中添加ajax功能
<div id="dialog" title="Upload Image">
<%
Html.BeginForm("Upload", "BugTracker", FormMethod.Post,new { id="uploadForm", enctype = "multipart/form-data"});
%>
Select a file: <input type="file" name="file" id="file" />
<h6>Upload a screenshot related to the ticket</h6>
<input type="submit" class="button" value="Upload" id="upload" onclick="uploadImage();" name="submit" />
<%Html.EndForm();%>
</div>
我已经设置了一个函数,当我上传表单提交时会调用它:
function uploadImage() {
var action = $("#uploadForm").attr('action');
$.ajaxFileUpload({
url: action,
secureuri: false,
fileElementId: 'file',
dataType: 'json',
success: function (data, status) {
$("#RelatedFileName").val() = data.FileName;
$("#dialog").dialog("close");
}
});
return false;
}
但它正在跳过成功回调函数,浏览器会询问我是否要下载json文件。以下是我的上传操作:
[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
Regex imageFilenameRegex = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$");
if (file != null)
{
if (!imageFilenameRegex.IsMatch(file.FileName))
{
return JavaScript("alert('invalid file. you must upload a jpg, jpeg, png, or gif');");
}
else
{
string filePath = Path.Combine(HttpContext.Server.MapPath("~/Uploads"), Path.GetFileName(file.FileName));
file.SaveAs(filePath);
return Json(new { FileName = "/Uploads/" + file.FileName });
}
}
else
{
return JavaScript("alert('seriously? select a file to upload before hitting the upload button.');");
}
}
我已经使用了jQuery.post,它会触发控制器动作,但文件将为null,但至少会在其警告框中弹出错误,所以这就是我找到另一个选项的原因。现在它命中控制器操作并且文件被上传,但它没有处理任何响应。任何帮助表示赞赏。
答案 0 :(得分:2)
即使您传递的是JSON,您使用的插件也需要text/html
作为响应内容类型。所以如果你真的想要使用它,你需要这样做:
return Content("{ FileName: '/Uploads/' }", "text/html");
如你所知,这是废话。
所以继续下载jquery form plugin。它更容易使用。您不必在HTML中执行任何操作,它完全不引人注目。只需按原样和javascript保留表单:
$(function() {
// Only indicate the form id, it will take care of reading the form action,
// returning false, ..., all you need is to concentrate
// on the success callback
$('#uploadForm').ajaxForm(function(result) {
alert(result);
});
});
另请注意,如果出现错误,您不应该返回Javascript。您总是需要从控制器操作中返回Json。所以如果出现错误:
return Json(new { errorMessage = "Kaboom", fileName = "" });
如果成功:
return Json(new { errorMessage = "", fileName = "/Uploads/" + file.FileName });
现在您可以通过检查返回的JSON对象上的errorMessage
属性来检查是否存在错误:
$('#uploadForm').ajaxForm(function(result) {
if (result.errorMessage != '') {
alert(result.errorMessage);
} else {
$('#RelatedFileName').val(result.fileName);
$('#dialog').dialog('close');
}
});
答案 1 :(得分:0)
如果您想进行ajax上传,则需要在iframe中执行上传表单。
请参阅:http://www.ajaxf1.com/tutorial/ajax-file-upload-tutorial.html
答案 2 :(得分:0)
此处也可以设置内容类型:
return Json(new { FileName = "/Uploads/filename.ext" }, "text/html", JsonRequestBehavior.AllowGet);