C#:使用ajax非同步請求實現文件上傳與下載功能。---項目框架API+MVC

来源:https://www.cnblogs.com/igqx/archive/2020/07/22/13361619.html
-Advertisement-
Play Games

1.首先使用VS創建WebAPI項目 (這裡有個幫助類,將此幫助類複製到項目里,有興趣可以學著寫) //文件上傳下載,導入導出輔助類 public class APIFileHelp { //此為限制文件格式 public string[] ExtentsfileName = new string[ ...


1.首先使用VS創建WebAPI項目

(這裡有個幫助類,將此幫助類複製到項目里,有興趣可以學著寫)

//文件上傳下載,導入導出輔助類

public class APIFileHelp
{

  //此為限制文件格式
  public string[] ExtentsfileName = new string[] { ".doc", ".xls", ".png", ".jpg" };

  //Upload為自定義的文件夾,在項目中創建
  public string UrlPath = "/Upload/";

  //響應對象 ,使用前先賦值
  public HttpResponse Response = HttpContext.Current.Response;
  public HttpRequest Request = HttpContext.Current.Request;

  //文件下載
  //downFileName下載後保存名,sourceFileName伺服器端物理路徑
  public void DownLoad(string downFileName, string sourceFileName)
  {
    if (File.Exists(sourceFileName))
    {
      Response.Clear();
      Response.ClearHeaders();
      Response.ClearContent();
      Response.Buffer = true;
      Response.AddHeader("content-disposition", string.Format("attachment; FileName={0}", downFileName));
      Response.Charset = "GB2312";
      Response.ContentEncoding = Encoding.GetEncoding("GB2312");
      Response.ContentType = MimeMapping.GetMimeMapping(downFileName);
      Response.WriteFile(sourceFileName);
      Response.Flush();
      Response.Close();
    }    
  }

//文件上傳操作
public FileResult UpLoad()
{
//保存文件名
string name = "";
if (Request.Files.Count > 0)
{
string FileUrlResult = "";
foreach (string fn in Request.Files)
{
var file = Request.Files[fn];
name = file.FileName.ToString();
var extenfilename = Path.GetExtension(file.FileName);
//判斷 路徑是否存在
string path = HttpContext.Current.Server.MapPath(UrlPath);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}

if (ExtentsfileName.Contains(extenfilename.ToLower()))
{
string urlfile = UrlPath + DateTime.Now.ToFileTime() + extenfilename;
string filepath = HttpContext.Current.Server.MapPath(urlfile);
file.SaveAs(filepath);
FileUrlResult += urlfile + ";";
}

//格式不正確
else
{
  //實例化結果類
return new FileResult() { Code = -1, Msg = "只允許上傳指定格式文件" + string.Join(",", ExtentsfileName), Url = "" }; } } //上傳成功 return new FileResult() { Code = 0, Name = name, Msg = "上傳成功", Url = FileUrlResult }; } //上傳失敗 else { return new FileResult() { Code = -1, Msg = "不能上傳空文件", Url = "" }; } } } //結果類 public class FileResult { public int Code { get; set; } //結果 public string Msg { get; set; } //提示信息 public string Url { get; set; } //地址 public string Name { get; set; } //文件名 }
//控制器端
public class FileOperationController : ApiController
{    
//實例化幫助類 APIFileHelp help
= new APIFileHelp(); [HttpGet] public void DownLoad(string Url) { string filePath = HttpContext.Current.Server.MapPath(Url); FileInfo fi = new FileInfo(filePath); help.DownLoad(fi.Name, fi.FullName); } //文件上傳 [HttpPost] public FileResult UpLoad() { return help.UpLoad(); } }
//文件上傳、下載: MVC端
//文件下載
//API地址+參數+自己定義的文件名+文件Url
<a href = "https://localhost:44370/api/FileOperation/DownLoad?Url=/FileUpload/132211303318715030.xls" > 下載 </ a >
<input type = "file" id="f1" />
<input type = "button" value="aa" onclick="ff()"/>

<script>
    function ff()
  {
    var formData = new FormData();
    var file = document.getElementById("f1").files[0];
    formData.append("fileInfo", file);
        $.ajax({
         url: "https://localhost:44370/api/FileOperation/UpLoad",
            type: "POST",
            data: formData,
            contentType: false,//必須false才會自動加上正確的Content-Type
            processData: false,//必須false才會避開jQuery對 formdata 的預設處理,XMLHttpRequest會對 formdata 進行正確的處理
            success: function(data) {
            if (data.Code == 0)
                alert(data.Msg)
                else
                alert(data.Url)
            },
            error: function(data) {
            alert("上傳失敗!");
        }
    });
}
</script>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PHP 自帶的 pcntl,存在很多不足,如: 沒有提供進程間通信的功能; 不支持重定向標準輸入和輸出; 只提供了 fork 這樣原始的介面,容易使用錯誤; Swoole\Process 提供瞭如下特性: 可以方便的實現進程間通訊; 支持重定向標準輸入和輸出,在子進程內 echo 不會列印屏幕,而是 ...
  • 使用Spring Aop註解的時候,如@Transactional, @Cacheable等註解一般需要在類方法第一個入口的地方加,不然不會生效。 如下麵幾種場景 1、Controller直接調用Service B方法:Controller > Service A 在Service A 上加@Tra ...
  • 1 單行註釋與多行註釋: 作用:解釋程式某些部分的功能和功能,提高程式的可讀性。單行註釋:#表示單行註釋的開始,直到這行結束為止的代碼都被忽視 多行註釋:使用三個單引號'''註釋'''或三個雙引號"""註釋 """ # 這是一行簡單的註釋 print("Hello world!") ''' 這裡面的 ...
  • 一、迭代器 1、迭代器 what 器=》工具 迭代:是一個重覆的過程,但每次重覆都是基於上一次的結果而來的 迭代器:就是一種不依賴於索引的取值工具 ps:迭代器可以裝下無窮個值,也可以產生無窮個值 names=["egon",'lqz','yj'] count = 1 while count < l ...
  • 從沒有被釋放的記憶體塊,可以獲得文件名、行號,泄漏多少位元組,會列印顯示出來。 ...
  • 服裝價格變動,觸發淘寶發佈活動和消費者購買衣服事件流 1 public class EventStandard 2 { 3 public class Clothes { 4 5 /// <summary> 6 /// 服裝編碼 7 /// </summary> 8 public string Id ...
  • 源碼還需優化,不喜勿噴。 微信官方文檔 : https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 前期準備: 1.微信開放平臺開發者資質認證 https://open.wei ...
  • 今天總結一下,調用第三方介面地址,以POST方式進行HTTP請求,並且入參為JSON格式方法: 引用:using System.Text;using System.Net;using System.IO; string url="http://";//第三方介面地址 paramStr //json字 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...