需求是这样的:把excel和一些其他的数据比如textBox的value select的值上传到服务器上统一进行处理,而且要求是同步,也就是说excel和其他的信息必须同时成功或者都不成功
上传文件就是把文件从本机上传到服务器,以前没有搞过这块,贸然之间不知道从何下手,上网查了很多资料,都是只用form表单然后用submit提交,但是因为业务的特殊性以及我们的MVC中的textBox是经过改装的,不能直接获取到val(),而且用form后不能再次异步提交其他数据(也可能是在下才疏学浅,如果有高人指点不胜感激)
后面找到的解决方案是用js插件来实现,下载地址
http://files.cnblogs.com/files/kissdodog/ajaxfileupload_JS_File.rar
同时感谢逆心,从这篇文章受到很大发:
http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html
插件是用异步实现的, 所以我的处理步
:先校验页面上值的合法性=>用插件提交excel到处理excel的Action中去=>在success中获取到action返回回来的地址加上页面上获取的值=>再次进行ajax提交到另外一个处理这个数据的action去=>得到处理结果
具体代码如下:
$.ajaxFileUpload({
url: '/BatchOrder/UpLoadExcel', //用于文件上传的服务器端请求地址
secureuri: false, //是否需要安全协议,一般设置为false
fileElementId: 'fileUpload', //文件上传域的ID
dataType: 'json', //返回值类型 一般设置为json
success: function (data) //服务器成功响应处理函数
{
//上传成功后继续执行上传其他数据的代码
if (data.Msg.indexOf("成功") != -1) {
//继续执行方法
//alert("Excel文件上传成功");
var filefillPath = data.ReturnFillPath
var fileName = data.FileName;
//如果成功,再次进行Ajax请求,存储采购商等数据
var request = { ClientID: clientID, PolicyClientID: policyClientID, AddOperatorID: addOperatorID, PolicyChannel: policyChannel, FileName: fileName, Remark: remark, FileFillPath: filefillPath };
$.ajax({
url: '/BatchOrder/Add',
type: 'post',
cache: false,
data: { input: request }
,
success: function (insertData) {
alert(insertData.Msg);
},
error: function () {
ShowDialogTip('查询错误,请重新查询');
}
});
} else {
alert(data.Msg);
return;
}
},
error: function ()//服务器响应失败处理函数
{
alert("Excel文件上传失败,请检查后重试");
}
})
html:
这里就是一个tr而已,前面有些textbox之类的东西,只要input type='file' 然后把id写对就能直接上传了
<tr>
<td colspan="4" class="form-inline align-c">
<div class="form-group">
<button class="btn" id="btnUpload" onclick="UpLoad()">上传</button>
</div>
<div class="form-group">
<button class="btn btn-dt" id="cancel">取消</button>
</div>
</td>
</tr>
最后是MVC的后台代码:
[HttpPost]
public ActionResult UpLoadExcel()
{
//全路径,用来插入数据库前计算excel记录条数
string returnFillPath = String.Empty;
string fileName = String.Empty;
try
{
HttpFileCollection files = System.Web.HttpContext.Current.Request.Files;
string configPath = ConfigurationManager.AppSettings["ExcelUpLoadSite"];
if (files.Count > 0)
{
//返回路径要写在这里才不会被后面所覆盖
configPath += files[0].FileName;
//判断文件是否存在
if(System.IO.File.Exists(configPath))
{
return Json(new { Msg = "上传失败,已存在同名的Excel,请检查后上传" });
}
files[0].SaveAs(configPath);
//返回文件名
fileName = files[0].FileName;
returnFillPath = configPath;
return Json(new { Msg = "Excel上传成功", FileName = files[0].FileName, ReturnFillPath = returnFillPath });
}
}
catch (Exception ex)
{
return Json(new { Msg = "上传失败" });
}
return Json(new { Msg = "未知错误,请联系管理员" });
}
至此上传文件就可以了,希望对大家有帮助