使用Ajax和一般处理程序实现文件上传与下载
1.使用HTML的input标签
<input type="file" multiple="multiple" id="file_load" />
2.使用JS为input的file添加一个change事件
$('#file_load').change(function () {
var fileObj = document.getElementById("file_load").files; // js 获取文件对象
if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
alert("请选择文件");
return;
}
if (fileObj.length > 10) { //因本人项目需求、一次最多上传的文件个数不能超过10个
alert("一次上传文件不能超过10个");
return;
}
var formData = new FormData(); //FormData专门用来给ajax向后台传递文件用的
formData.append("action", "FileLoad");//向后台传递值、是键值对的形式
for (var i = 1; i <= fileObj.length; i++) {
formData.append("file", fileObj[i]); //向formData 里追加文件
}
$.ajax({
url: "../Method/FileUpload.ashx",
type: "post",
cache: false,
data: formData,
dataType: 'json', //这里采用json格式向后台传递数据、如果后台需要返回信息也必须返回json数据 只有这样ajax的回调函数才能接收到后台传过来的值
cache: false,//上传文件无需缓存
processData: false,//用于对data参数进行序列化处理 这里必须false
contentType: false,
success: function (data) {
if (data == 'OK') {
//上传完成
};
}
}
});
});
3.一般处理程序(上传)
public void FileLoad(HttpContext context)
{
string path = "";//文件保存路径
for (int i = 0; i < context.Request.Files.Count; i++)
{
HttpPostedFile file = context.Request.Files[i];
path = context.Server.MapPath("~/File/" + file.FileName);
file.SaveAs(path);
}
//返回json数据
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize("OK"));
}
4.文件下载前端
我这里不方便使用项目中的代码,所以就简单写个Demo
<a href="../Method/FileDowload.ashx?action=DowFile&filename=1.txt">下载</a> 直接使用a标签访问一般处理程序,带两个参数 分别为需要请求的方法和需要下载的文件名称
action=DowFile、filename=1.txt
4.一般处理程序(下载)
public void DowFile(HttpContext context)
{
string filename = context.Request["filename"].ToString(); //文件名称就是前端传来的filename这个参数
string path = "~/File/" + filename;
System.IO.FileInfo file = new System.IO.FileInfo(System.Web.HttpContext.Current.Server.MapPath(path));
context.Response.Clear();
context.Response.Charset = "UTF-8";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.AddHeader("Content-Type", "application/octet-stream");
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名,设定编码为UTF8,防止中文文件名出现乱码
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
context.Response.AddHeader("Content-Length", file.Length.ToString());
//// 指定返回的是一个不能被客户端读取的流,必须被下载
context.Response.ContentType = "application/ms-excel";
// 把文件流发送到客户端
context.Response.WriteFile(path);
// 停止页面的执行
context.Response.End();
}
我这个是在项目的跟目录里创建了一个文件夹File。<input type="file" multiple="multiple" id="file_load" />标签的默认样式改法有很多 百度上有