【发布时间】:2015-05-09 03:16:44
【问题描述】:
我有一个简单的表单,其中包含一个文件类型的输入,它只接受图像。 我只想发布文件并将其保存在表格和服务器中。
下面是我的cshtml
@using (Html.BeginForm("UploadSlider", "Admin", FormMethod.Post, new { id = "frmUploadSliderImage", @class = "form-admin" }))
{
<h2 class="form-login-heading">upload images</h2>
<div class="login-wrap">
<span class="btn btn-default btn-file">
Browse <input type="file" id="sliderFile" multiple="multiple">
</span>
<span class="text-muted" id="filePlaceHolder">No files selected</span>
<span class="text-danger"></span>
<button class="btn btn-theme btn-block" name="upload" onclick="javascript: ValidateSliderImageandPost('frmUploadSliderImage', this);" id="btnUploadSliderImage" type="submit"><i class="fa fa-upload"></i> UPLOAD</button>
</div>
}
这是我的 js ajax 部分
function ValidateSliderImageandPost(form, ctrl) {
$("#" + form).on("submit", function (e) {
e.preventDefault();
var formContainer = $('#' + form + ' .text-danger');
var formdata = new FormData();
var fileInput = $('#sliderFile');
if ($(fileInput).get(0).files.length == 0)
{
$('.btn-file :file').parent().siblings().filter(".text-danger").html('Please select a file!');
}
if ($(formContainer).text().length == 0) {
run_waitMe('Uploading! Please wait...', 'stretch', '.container');
$.each($(fileInput).get(0).files, function (index,value) {
formdata.append($(this).attr('name'), $(this));
});
postData('UploadSlider', formdata, '.upslider .status');
if (msg) {
$(".container").find('#cont').waitMe('hide');
$("#" + form).find('input[type=text], textarea').val('').removeClass("alert-success");
}
else {
$(".container").find('#cont').waitMe('hide');
$("#" + form).find('input[type=text], textarea').removeClass("alert-success");
}
}
$("#" + form).unbind('submit');
return false;
});
}
function postData(url,data,target)
{
$.ajax({
url: url,
type: "POST",
dataType: 'json',
data: data,
processData: false,
contentType:false,
success: function (data) {
if (data.result) {
animateStatus("success", data.message, target);
msg = true;
}
else {
animateStatus("fail", data.message, target);
msg = false;
}
},
error:
function (data) {
animateStatus("fail", data.message, target);
msg = false;
}
});
}
这是我的控制器部分
[HttpPost]
public JsonResult UploadSlider()
{
bool valid = false;
bool val = false;
if (Request.Files.Count > 0)
{
valid = true;
}
else
{
return Json(new { result = false, message = "Something went wrong! Please try again!" });
}
if (valid)
{
List<string> fil = new List<string>();
foreach (HttpPostedFileBase f in Request.Files)
{
HttpPostedFileBase file = f; //Uploaded file
string fileName = file.FileName;
fil.Add("./Images/Galllery/" + fileName);
System.IO.Stream fileContent = file.InputStream;
file.SaveAs(Server.MapPath("~/Images/Gallery/") + fileName);
}
using (var context = new MCBConnectionString())
{
foreach (string path in fil)
{
tbl_slider slider = new tbl_slider();
slider.slurl = path;
slider.slalt = "";
context.tbl_slider.Add(slider);
context.SaveChanges();
val = true;
}
}
if (val)
{
return Json(new { result = true, message = "Uploaded video successfully." });
}
else
{
return Json(new { result = false, message = "Could not upload video. Please try again!" });
}
}
return Json(new { result = false, message = "Could not upload video. Please try again!" });
}
当我调试并检查 Request.Files.Count 时,它总是为零。是否有任何替代解决方法,或者我在发布文件时是否犯了任何错误。我已关注 this 链接并根据我的需要进行了更改。
【问题讨论】:
-
对于初学者来说,您将 formData 对象传递给 ajax 调用,然后将其字符串化,这是行不通的,为什么在尝试发送时要发送 JSON 字符串文件?其次,您必须在 ajax 调用中设置某些选项,必须关闭数据处理等。快速搜索将为您提供数百个答案,其中包含为 ajax 调用设置什么以使其正常工作的示例代码。
-
@adeneo.. 我已经更新了问题... 结果还是一样。
-
现在看看
msg,它是在一个完全不同的函数中定义的,顺便说一下是异步的 -
msg 是全局的,仅供我参考,用于向用户显示有效或无效的消息。这与在控制器方法中检索 Request.Files 有什么关系
-
我只是注意到它不起作用,即使它是全局的,因为
postData是异步的。这不应该阻止文件被发送,不幸的是我的 ASP 不是很好,但看起来你期待 JSON,但这不是你现在发送的,在你改变了你的 ajax 选项之后现在发送一个标准的 www 编码形式。
标签: javascript jquery ajax asp.net-mvc file-upload