ASP.NET文件上传Upload的实现方法

 更新时间:2021年9月22日 10:06  点击:1942

本文实例为大家分享了ASP.NET 文件上传,供大家参考,具体内容如下

1、最近应项目开发的需求要实现附件的异步上传和下载。

2、上传:文件上传到指定的路径下,并返回上传文件的信息给前端界面,如:文件的图标、上传的文件名、文件的大小。

3、上传后,在前端界面上显示上传的文件信息,点击文件名实现将上传的文件下载到本地。

4、先展示一下Demo运行的效果图:

点击提交后:

点击文件名实现下载到本地:

5、下面就给出前台代码:

<!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" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
 <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/icon.css">
 <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/demo/demo.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">&nbsp;</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>文件大小:</label>
 <label class="size"></label><button id="delete">删除</button>
 <button id="loding">导入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、后台上传代码:

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);//附件保存的绝对路径
    dic.Add("attachmentType", fileinfo.Extension);//附件类型
    dic.Add("attachmentName", Path.GetFileName(file.LocalFileName));//上传的附件名
    dic.Add("attachSize", Convert.ToInt32(filelength));//附件大小KB
    dic.Add("aealPath", tempPath + saveFileName);//附件保存相对路径
   }
   }
   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;//附件保存的绝对路径
  var relativePath = string.Empty;//返回相对路径
  var AttachSize = 0;//文件大小kB
  var AttachmentType = string.Empty;//文件扩展名
  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 获取图标路径

   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 获取图标路径

   #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 获取界面参数

  NameValueCollection nvc = HttpContext.Current.Request.QueryString;
  int ID = nvc["ID"].TryToInt();
  if (ID <= 0)
  {
  return HandleJson.ToJson("传入参数错误", false);
  }

  #endregion 获取界面参数

  #region SQL

  StringBuilder sql = new StringBuilder();
  sql.Append(@"SELECT * FROM dbo.Attachment(NOLOCK) WHERE ID=@ID ");

  #endregion SQL

  #region 执行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());//下载文件的绝对路径
  string fileName = dt.Rows[0]["AttachmentName"].TryToString();//下载的文件名

  #endregion 执行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、以上只是我个人的一个小Demo,有不对或需要改进的地方还请大家多多提点!

精彩专题分享:ASP.NET文件上传汇总 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • 借助FileReader实现将文件编码为Base64后通过AJAX上传

    这篇文章主要介绍了借助FileReader实现将文件编码为Base64后通过AJAX上传的方法,包括后端对文件数据解码并保存的PHP代码,需要的朋友可以参考下...2015-12-25
  • js实现上传文件添加和删除文件选择框

    这篇文章主要为大家详细介绍了js实现上传文件添加和删除文件选择框 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-25
  • jQuery+ajax简单实现文件上传的方法

    这篇文章主要介绍了jQuery+ajax简单实现文件上传的方法,结合实例形式简单分析了jQuery基于ajax的post方法进行文件传输及asp.net后台处理技巧,需要的朋友可以参考下...2016-06-12
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • 适用于初学者的简易PHP文件上传类

    本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<&#63;phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30
  • js 实现文件上传样式详情

    这篇文章主要介绍了js 实现文件上传样式,下面文章举例说明js 是如何实现文件上传样式的,附有代码详细解说,需要的朋友可以参考一下,希望对你有所帮助...2021-10-21
  • ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表

    在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19
  • asp.net通过消息队列处理高并发请求(以抢小米手机为例)

    这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22
  • PHP利用APC模块实现大文件上传进度条的方法

    php 大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu 、Google ,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc +php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。 Altern...2015-10-30
  • C#文件上传的简单实现

    这篇文章主要为大家详细介绍了C#文件上传的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • TypeScript前端上传文件到MinIO示例详解

    这篇文章主要为大家介绍了TypeScript前端上传文件到MinIO示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-10-12