C# 實(shí)現(xiàn)上傳和下載文件(Vue+axios+Element UI)

前端:Vue+axios+Element UI

后端:C# .Net 一般處理程序(ashx)


上傳文件

前端代碼 Element UI

使用Element UI的el-upload組件

<!-- action:文件上傳的URL地址(必需)../../../../../ISV/AttachmentSite/FileUpload.ashx -->
<!-- drag:是否啟用拖拽上傳 -->
<!-- multiple:是否支持多選文件 -->
<!-- limit:最大允許上傳個(gè)數(shù) -->
<!-- file-list:上傳的文件列表 -->
<!-- http-request:自定義上傳行為:http-request="FileUploadRequest"-->
<!-- on-success:文件上傳成功時(shí)的鉤子 -->
<!-- on-error:文件上傳失敗時(shí)的鉤子-->
<!-- before-upload:文件上傳之前的鉤子,返回false終止上傳-->
<!-- on-change:文件狀態(tài)改變時(shí)的鉤子裹赴,添加文件喜庞、上傳成功和上傳失敗時(shí)都會(huì)被調(diào)用-->
<el-upload style="width:100%"
            class="upload-demo"
            :action="actionUrl"
            :file-list="fileList"
            :on-success="FileOnSuccess"
            :on-error="FileOnError"
            :before-upload="FileBeforeUpload"
            :on-change="FileOnChange"
            :limit="11"
            multiple
            drag>
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">將文件拖到此處诀浪,或<em>點(diǎn)擊上傳</em></div>
    <div class="el-upload__tip" slot="tip">上傳文件不能超過100M</div>
</el-upload>
后端代碼 C# (ashx)
public class FileUpload : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "application/json";
        try
        {
            string userID = HttpContext.Current.Request.QueryString["userID"];

            //HttpPostedFile Files=context.Request.Files["File"];// 單個(gè)文件
            HttpFileCollection Files = HttpContext.Current.Request.Files;// 多個(gè)文件

            string AbsolutePath = ConfigurationManager.AppSettings["IsAbsolutePath"];
            bool IsAbsolutePath = Convert.ToBoolean(AbsolutePath);// 是否啟用絕對(duì)路徑

            string FilePath = "";// 文件路徑
            if (IsAbsolutePath)
            {
                FilePath = ConfigurationManager.AppSettings["FilePath"].ToString();// 絕對(duì)文件路徑
            }
            else
            {
                FilePath = HttpContext.Current.Request.PhysicalApplicationPath+ "\\Attachment\\";// 獲取應(yīng)用程序的根路徑
                //FilePath = FilePath.Replace("AttachmentSite", "Attachment");// 將站點(diǎn)地址替換為文件地址
            }

            // 判斷文件路徑是否存在
            if (!System.IO.Directory.Exists(FilePath))
            {
                System.IO.Directory.CreateDirectory(FilePath);//創(chuàng)建文件夾
            }

            // 保存文件
            Dictionary<string, string> dicFilePath = new Dictionary<string, string>();// 返回結(jié)果字典
            foreach (string strFile in Files)
            {
                HttpPostedFile File = Files[strFile];// 用key獲取單個(gè)文件對(duì)象HttpPostedFile
                File.SaveAs(FilePath + File.FileName);// 保存文件
                dicFilePath.Add(File.FileName, FilePath + File.FileName);
            }

            LogHelper.AppDebugLog("[FileUpload] userID=" + userID + " 文件路徑:" + JsonConvert.SerializeObject(new { FilePath = dicFilePath }));
            context.Response.Write(JsonConvert.SerializeObject(new { FilePath = dicFilePath }));
        }
        catch (Exception e)
        {
            LogHelper.AppErrorLog(e, "[FileUpload] " + e.Message);
            context.Response.Write(JsonConvert.SerializeObject(new { Error = e.Message }));
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Web.config文件中配置了跨域、上傳文件限制大小延都、上傳文件路徑的配置項(xiàng)

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2" maxRequestLength="1048576000" executionTimeout="3600"/>
  </system.web>

<!--跨域請(qǐng)求-->
<system.webServer>
  <httpProtocol>
    <customHeaders>
      <!--允許的請(qǐng)求方式-->
      <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
      <!--允許的請(qǐng)求頭信息-->
      <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
      <!--允許的請(qǐng)求地址 *表示所有-->
      <add name="Access-Control-Allow-Origin" value="*"/>
      <!--是否攜帶cookie信息,注意:為true時(shí),Access-Control-Allow-Origin不允許為*-->
      <add name="Access-Control-Allow-Credentials" value="false"/>
    </customHeaders>
  </httpProtocol>
  
  <security>
    <requestFiltering>
      <!--文件大小限制 1000 MB  -->
      <requestLimits maxAllowedContentLength="1048576000" />
    </requestFiltering>
  </security>
</system.webServer>

  <appSettings>
    <!--是否啟用絕對(duì)路徑-->
    <add key="IsAbsolutePath" value="false" />
    <!--絕對(duì)文件路徑-->
    <add key="FilePath" value="C:\Attachment\" />
  </appSettings>

</configuration>

下載文件(單個(gè)文件)

前端代碼 Vue+axios

按鈕調(diào)用methods中的FileDownloadRequest方法
就打算離開房間 jdsk 十九點(diǎn).zip 是文件名稱(有中文有空格)

// 下載文件
FileDownloadRequest: function () {
    // 發(fā)起Ajax請(qǐng)求
    axios({
        method: 'post',
        url: 'http://localhost:8022/FileDownload.ashx',// 服務(wù)器CRM附件站點(diǎn)
        responseType: 'blob'
    })
        // 下載文件成功
        .then(res => {
            console.log(res);
            //對(duì)于<a>標(biāo)簽雷猪,只有 Firefox 和 Chrome(內(nèi)核) 支持 download 屬性,IE10+支持blob但是依然不支持download
            if ('download' in document.createElement('a')) {//支持a標(biāo)簽download的瀏覽器
                let url = window.URL.createObjectURL(res.data);//為文件流創(chuàng)建構(gòu)建下載鏈接
                let link = document.createElement('a');//創(chuàng)建a標(biāo)簽
                link.style.display = 'none';
                link.href = url;
                link.setAttribute('download', "就打算離開房間 jdsk 十九點(diǎn).zip");//設(shè)置a標(biāo)簽的下載動(dòng)作和下載文件名 /row.new_filefullname
                document.body.appendChild(link);
                link.click();//執(zhí)行下載
                document.body.removeChild(link);//釋放標(biāo)簽
            }
            else {
                //其他瀏覽器
                navigator.msSaveBlob(res.data, "就打算離開房間 jdsk 十九點(diǎn).zip");
            }
        })
        // 下載文件失敗
        .catch(err => {
            console.log(err);
            this.$message.error({ message: err.message });
        })
},

后端代碼 C# (ashx)

C# TransmitFile 方式下載
特別注意://context.Response.Write("Hello World");// 不能夠輸出其他信息晰房,否則瀏覽器下載的文件會(huì)有問題(文件損壞)

public class FileDownload : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        string filename = "就打算離開房間jdsk十九點(diǎn).zip";// 文件名稱
        string filepath = "C:\\Attachment\\" + filename;// 文件路徑
        try
        {
            context.Response.ContentType = "application/octet-stream";// 文件類型 /application/octet-stream 表示所有文件
            context.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);// 文件名稱
            context.Response.TransmitFile(filepath);// 將文件寫入HTTP響應(yīng)輸出流
            //context.Response.Write("Hello World");// 不能夠輸出其他信息求摇,否則瀏覽器下載的文件會(huì)有問題(文件損壞)
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Web.config文件中配置了跨域的配置項(xiàng)

<configuration>

  <!--跨域請(qǐng)求-->
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!--允許的請(qǐng)求方式-->
        <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>
        <!--允許的請(qǐng)求頭信息-->
        <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>
        <!--允許的請(qǐng)求地址 *表示所有-->
        <add name="Access-Control-Allow-Origin" value="*"/>
        <!--是否攜帶cookie信息,注意:為true時(shí),Access-Control-Allow-Origin不允許為*-->
        <add name="Access-Control-Allow-Credentials" value="false"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

</configuration>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市殊者,隨后出現(xiàn)的幾起案子与境,更是在濱河造成了極大的恐慌,老刑警劉巖猖吴,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摔刁,死亡現(xiàn)場離奇詭異,居然都是意外死亡海蔽,警方通過查閱死者的電腦和手機(jī)共屈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來党窜,“玉大人拗引,你說我怎么就攤上這事』弦拢” “怎么了寺擂?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泼掠。 經(jīng)常有香客問我怔软,道長,這世上最難降的妖魔是什么择镇? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任挡逼,我火速辦了婚禮,結(jié)果婚禮上腻豌,老公的妹妹穿的比我還像新娘家坎。我一直安慰自己,他們只是感情好吝梅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布虱疏。 她就那樣靜靜地躺著,像睡著了一般苏携。 火紅的嫁衣襯著肌膚如雪做瞪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音装蓬,去河邊找鬼著拭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牍帚,可吹牛的內(nèi)容都是我干的儡遮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼暗赶,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼鄙币!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹂随,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤十嘿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后糙及,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體详幽,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筛欢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年浸锨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片版姑。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柱搜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剥险,到底是詐尸還是另有隱情聪蘸,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布表制,位于F島的核電站健爬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏么介。R本人自食惡果不足惜娜遵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壤短。 院中可真熱鬧设拟,春花似錦、人聲如沸久脯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帘撰。三九已至跑慕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摧找,已是汗流浹背相赁。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工相寇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钮科。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓唤衫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绵脯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佳励,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容