ASP.NET文件上傳Upload的實(shí)現(xiàn)方法
本文實(shí)例為大家分享了ASP.NET 文件上傳,供大家參考,具體內(nèi)容如下
1、最近應(yīng)項(xiàng)目開(kāi)發(fā)的需求要實(shí)現(xiàn)附件的異步上傳和下載。
2、上傳:文件上傳到指定的路徑下,并返回上傳文件的信息給前端界面,如:文件的圖標(biāo)、上傳的文件名、文件的大小。
3、上傳后,在前端界面上顯示上傳的文件信息,點(diǎn)擊文件名實(shí)現(xiàn)將上傳的文件下載到本地。
4、先展示一下Demo運(yùn)行的效果圖:

點(diǎn)擊提交后:

點(diǎn)擊文件名實(shí)現(xiàn)下載到本地:

5、下面就給出前臺(tái)代碼:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ajax Form - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" >
<link rel="stylesheet" type="text/css" >
<link rel="stylesheet" type="text/css" >
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
</head>
<body>
<h2>Ajax Form Demo</h2>
<div class="demo-info" style="margin-bottom:10px">
<div class="demo-tip icon-tip"> </div>
<div>Type in input box and submit the form.</div>
</div>
<div class="easyui-panel" title="Ajax Form" style="width:300px;padding:10px;">
<form id="ff" action="api/Loding" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>Name:</td>
<td><input name="name" class="f1 easyui-textbox"></input></td>
</tr>
<tr>
<td>Email:</td>
<td><input name="email" class="f1 easyui-textbox"></input></td>
</tr>
<tr>
<td>Phone:</td>
<td><input name="phone" class="f1 easyui-textbox"></input></td>
</tr>
<tr>
<td>File:</td>
<td><input name="file" class="f1 easyui-filebox"></input></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交"></input></td>
</tr>
</table>
<input type="text" value="LodingTable" name="tableName" hidden="hidden" />
</form>
</div>
<div>
<img id="img" src="" width="20" height="20" />
<a id="downLoad" downloadid="0" href="#"></a>
<label>文件大?。?lt;/label>
<label class="size"></label><button id="delete">刪除</button>
<button id="loding">導(dǎo)入1</button>
</div>
<style scoped>
.f1 {
width: 200px;
}
</style>
<script type="text/javascript">
$(function () {
$("#loding").hide();
$("#delete").hide().click(function () {
alert("刪除文件");
});
$("#loding").click(function () {
var tUrl = '/api/Loding/Get';
//var tJsonStr = '{"idInventoryPrice":"4","withdrawDetails":[{"cInvCode":"800487","cInvCodeSub":"00","iConverDiscount":"0","iUnitPrice":"9.9","iSalePrice":"9.9"},{"cInvCode":"800689","cInvCodeSub":"00","iConverDiscount":"0","iUnitPrice":"6.5","iSalePrice":"5.9"}]}';
$.ajax({
type: "Get",
url: tUrl,
dataType: "json",
async: false,
success: function (data) {
alert(JSON.stringify(data));
}
});
});
$('#ff').form({
success: function (data) {
var json = JSON.parse(data);
if (json.result == 1) {
$("#delete").show();
$("#img").attr("src", json.details[0].AttachmentNameTypeICO);
$("#downLoad").attr("downloadid", json.details[0].ID); $("#downLoad").html(json.details[0].AttachmentName);
$(".size").html(json.details[0].AttachSize + "KB");
var tUrl = 'http://localhost:11703/api/Loding/DownLoad?ID=' + $("#downLoad").attr("downloadid");
$("#downLoad").attr("href", tUrl);
}
else {
alert(json.resultdetail);
}
}
});
});
</script>
</body>
</html>
6、后臺(tái)上傳代碼:
NameValueCollection nvf = HttpContext.Current.Request.Form;
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string tempPath = "/Upload/" + DateTime.Now.ToString("yyyy-MM-dd/");
string fileSaveLocation = HttpContext.Current.Server.MapPath("~" + tempPath);//附件的保存地址
Dictionary<string, object> dic = new Dictionary<string, object>();
if (!Directory.Exists(fileSaveLocation))
{
Directory.CreateDirectory(fileSaveLocation);
}
CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation);
try
{
var result = await Request.Content.ReadAsMultipartAsync(provider).ContinueWith<Dictionary<string, object>>(x =>
{
var file = provider.FileData[0];
FileInfo fileinfo = new FileInfo(file.LocalFileName);
if (fileinfo.Length <= 0)
{
dic.Add("result", -1);
dic.Add("resultdetail", "未上傳文件");
}
else
{
double? filelength = fileinfo.Length / 1024.0;
if (filelength > 10 * 1024)
{
dic.Add("result", -1);
dic.Add("resultdetail", "上傳文件不能大于10M");
}
else
{
string saveFileName = Guid.NewGuid().ToString() + fileinfo.Extension;
fileinfo.CopyTo(Path.Combine(fileSaveLocation, saveFileName), true);
fileinfo.Delete();
dic.Add("result", 1);
dic.Add("resultdetail", "上傳成功");
dic.Add("realPath", file.LocalFileName);//附件保存的絕對(duì)路徑
dic.Add("attachmentType", fileinfo.Extension);//附件類(lèi)型
dic.Add("attachmentName", Path.GetFileName(file.LocalFileName));//上傳的附件名
dic.Add("attachSize", Convert.ToInt32(filelength));//附件大小KB
dic.Add("aealPath", tempPath + saveFileName);//附件保存相對(duì)路徑
}
}
return dic;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
catch (Exception ex)
{
return HandleJson.ToJson(ex.ToString(), false);
}
var isSuccess = dic["result"].TryToInt() == 1;
var msg = dic["resultdetail"].TryToString();//返回上傳信息
var realPath = string.Empty;//附件保存的絕對(duì)路徑
var relativePath = string.Empty;//返回相對(duì)路徑
var AttachSize = 0;//文件大小kB
var AttachmentType = string.Empty;//文件擴(kuò)展名
var AttachmentName = string.Empty;//原文件名
if (isSuccess)
{
realPath = dic["realPath"].TryToString();
relativePath = dic["aealPath"].TryToString();
AttachSize = dic["attachSize"].TryToInt();
AttachmentType = dic["attachmentType"].TryToString();
AttachmentName = dic["attachmentName"].TryToString();
}
StringBuilder sql = new StringBuilder();
if (isSuccess)
{
try
{
#region 獲取圖標(biāo)路徑
var ICOPath = string.Empty;
sql.Append(@"SELECT * FROM dbo.AttachmentType(NOLOCK) WHERE AttachmentType=@AttachmentType");
var ICOTable = Common.HandleSQL.GetData(sql.ToString(), null, new SqlParameter[] { new SqlParameter("@AttachmentType", AttachmentType) });
if (ICOTable.Rows.Count <= 0)
{
ICOPath = "";
}
else
{
ICOPath = ICOTable.Rows[0]["AttachmentNameTypeICO"].ToString();
}
#endregion 獲取圖標(biāo)路徑
#region 保存上傳記錄
sql.Clear();
sql.Append(@"DECLARE @ID INT
SELECT @ID=MAX(ID)+1 FROM dbo.Attachment(NOLOCK)
IF(@ID IS NULL)
BEGIN
SET @ID=1
END
INSERT INTO dbo.Attachment
( ID ,
AttachmentName ,
AttachmentType ,
RealPath ,
AttachSize ,
UpLoadDate ,
UpLoadPerson ,
UpLoadIPAddress
)
VALUES ( @ID , -- ID - int
@AttachmentName , -- AttachmentName - nvarchar(max)
@AttachmentType , -- AttachmentType - nvarchar(50)
@RealPath , -- RealPath - nvarchar(max)
@AttachSize , -- AttachSize - bigint
GETDATE() , -- UpLoadDate - datetime
@UpLoadPerson , -- UpLoadPerson - nvarchar(50)
@UpLoadIPAddress -- UpLoadIPAddress - varchar(50)
)
SELECT * FROM dbo.Attachment(NOLOCK) WHERE ID=@ID;
");
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@AttachmentName", AttachmentName),
new SqlParameter("@AttachSize", AttachSize), new SqlParameter("@RealPath", relativePath),
new SqlParameter("@AttachmentType", AttachmentType),new SqlParameter("@UpLoadPerson","魏小偉"),new SqlParameter("@UpLoadIPAddress",HandleLog.getIPAddress()) };
var insert = GetData(sql.ToString(), null, paras);
insert.Columns.Add("AttachmentNameTypeICO", typeof(string));
insert.Rows[0]["AttachmentNameTypeICO"] = ICOPath;
int ID = Convert.ToInt32(insert.Rows[0]["ID"].ToString());//上傳附件的ID
return HandleJson.ToJson(insert, 0);
#endregion 保存上傳記錄
}
catch (Exception ex)
{
if (System.IO.File.Exists(realPath))
{
File.Delete(realPath);
}
return HandleJson.ToJson(ex.ToString(), false);
}
}
else
{
return HandleJson.ToJson(msg, false);
}
7、下載代碼:
[HttpGet, Route("api/Loding/DownLoad")]
public HttpResponseMessage DownLoad()
{
#region 獲取界面參數(shù)
NameValueCollection nvc = HttpContext.Current.Request.QueryString;
int ID = nvc["ID"].TryToInt();
if (ID <= 0)
{
return HandleJson.ToJson("傳入?yún)?shù)錯(cuò)誤", false);
}
#endregion 獲取界面參數(shù)
#region SQL
StringBuilder sql = new StringBuilder();
sql.Append(@"SELECT * FROM dbo.Attachment(NOLOCK) WHERE ID=@ID ");
#endregion SQL
#region 執(zhí)行SQL
var dt = HandleSQL.GetData(sql.ToString(), null, new SqlParameter[] { new SqlParameter("@ID", ID) });
if (dt.Rows.Count <= 0)
{
return HandleJson.ToJson("未找到下載文件", false);
}
var filePath = HttpContext.Current.Server.MapPath("~" + dt.Rows[0]["RealPath"].TryToString());//下載文件的絕對(duì)路徑
string fileName = dt.Rows[0]["AttachmentName"].TryToString();//下載的文件名
#endregion 執(zhí)行SQL
#region 下載文件并添加下載記錄
try
{
//var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/download/" + fileName);
var stream = new FileStream(filePath, FileMode.Open);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName
};
#region 添加下載記錄
sql.Clear();
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@ID", ID), new SqlParameter("@DownLoadPerson", "魏小偉"), new SqlParameter("@DownLoadIP", HandleLog.getIPAddress()) };
sql.Append(@"DECLARE @AutoID INT
SELECT @AutoID=MAX(AutoID)+1 FROM dbo.AttachmentDowLoadLog(NOLOCK)
IF(@AutoID IS NULL)
BEGIN
SET @AutoID=1
END
INSERT INTO dbo.AttachmentDowLoadLog
( AutoID ,
ID ,
DownLoadPerson ,
DownLoadDate ,
DownLoadIP
)
VALUES ( @AutoID , -- AutoID - int
@ID , -- ID - int
@DownLoadPerson , -- DownLoadPerson - nvarchar(max)
GETDATE() , -- DownLoadDate - datetime
@DownLoadIP -- DownLoadIP - nvarchar(50)
);");
execSQL(sql.ToString(), null, paras);
#endregion 添加下載記錄
return response;
}
catch
{
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
#endregion 下載文件并添加下載記錄
}
8、以上只是我個(gè)人的一個(gè)小Demo,有不對(duì)或需要改進(jìn)的地方還請(qǐng)大家多多提點(diǎn)!
精彩專(zhuān)題分享:ASP.NET文件上傳匯總
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
VsCode插件開(kāi)發(fā)之插件初步通信的方法步驟
這篇文章主要介紹了VsCode插件開(kāi)發(fā)之插件初步通信的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
自寫(xiě)一個(gè)模仿Dictionary與Foreach的實(shí)現(xiàn)及心得總結(jié)
利用閑暇時(shí)間自己寫(xiě)一個(gè)類(lèi)模仿Dictionary實(shí)現(xiàn),如果一個(gè)類(lèi)進(jìn)行foreach的話(huà),該類(lèi)必須實(shí)現(xiàn)IEnumerable,集合要支持foreach方式的遍歷,必須實(shí)現(xiàn)IEnumerable接口,感興趣的你可不要錯(cuò)過(guò)了哈2013-02-02
在ASP.NET中使用Session常見(jiàn)問(wèn)題集錦
在ASP.NET中使用Session常見(jiàn)問(wèn)題集錦...2007-08-08
C#數(shù)據(jù)綁定控件中的DataSource屬性淺談
使用該屬性指定用來(lái)填充Repeater控件的數(shù)據(jù)源。DataSource可以是任何System.Collections.IEnumerable對(duì)象, 如用于訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的System.Data.DataView、System.Collections.ArrayList、System.Collections.Hashtable、數(shù)組或IListSource對(duì)象2013-02-02
DataGridView自動(dòng)調(diào)整行高和行寬
根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整列寬,根據(jù)數(shù)據(jù)內(nèi)容自動(dòng)調(diào)整行高2009-04-04
ASP.NET MVC 導(dǎo)出Word報(bào)表
本文主要介紹了ASP.NET MVC 導(dǎo)出Word報(bào)表的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02

