---
# System prepended metadata

title: 筆記_UploadFile_用原始HTML標籤
tags: [檔案上傳, web form]

---

# 筆記_UploadFile_用原始HTML標籤
----
###### tags: `web form` `檔案上傳`

引用:
[用request.files实现异文件上传【开放式上传】](https://blog.csdn.net/WuLex/article/details/76501952)

[C# - Postback生命週期](http://e-troy.blogspot.com/2014/04/c-postback.html)

[Uploading Files in ASP.net without using the FileUpload server control](https://stackoverflow.com/questions/569565/uploading-files-in-asp-net-without-using-the-fileupload-server-control)

---

- 注意的地方
- Request.Files 與 Context.Request.Files的不同
> - Form
> - Button
> - 事件
- Form
> - FormASP
> - FormHTML
> - runat="server": runat就是在server上執行編譯的過程
- Button&事件

## 注意的地方
這位講的都是正確的
但實際上做出 **上傳檔案**是在Page_load上是有問題的

**form**

使用原本HTMLTag時當然要加上
- Http方式
- 編碼類型
- 送去哪裡

`method="post" enctype="multipart/form-data" action="Test4.aspx"`

---

**Button**
如果用HTML_Button的話
有兩件事要注意

> **ASP.NET是事件驅動**
> **要如何讓.aspx.cs邏輯程式去 抓到前面的事件觸發!??**
>
> \^上面這句是重點\^

---

**Event**

如何給元素加上事件?

[C# - Postback生命週期](http://e-troy.blogspot.com/2014/04/c-postback.html)

---

## Form
首先先看Form
在原本的ASPTag中只有

### FormASP
```C#
<form id="form1" runat="server">
    <div>
        <asp:ImageButton ID="ImageButton1" runat="server" />
        <asp:FileUpload ID="FileUpload1" runat="server" AllowMultiple="True" />
        <asp:Button ID="Button1" CssClass="submitbtn" runat="server" Text="送出" OnClick="Button1_Click" />
        <br />
    </div>
</form>
```

**`runat="server"` ** 幫我們做掉很多東西

## FormHTML

```C#
<form id="form1" method="post" enctype="multipart/form-data" action="Test4.aspx">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
        <input id="File1" name="File1" type="file"/>
        <input id="Button1" type="submit" runat="server" onServerClick="ServeSideEvent" value="button" />
    </div>
</form>
```

這時會會發現 Form 的確有 Submit
也放入了 `action="Test4.aspx`
但程式似乎就是沒進入到.aspx.cs

按下Button後因為`IsPostBack` 所以是不會出現Hello User

- F12沒有Response.aspx.cs
> 1. 因為程式連出去都沒出去 不然會進Page_load
> 2. 就算是正常的 ASP.Net 也已經把Response做掉了!!

**不正常** 下的ASP.Net顯示結果
![](https://i.imgur.com/qTszVIE.png)

**正常**下的ASP.Net顯示結果(沒有Hello User, end先不要看)
![](https://i.imgur.com/HzNZrlz.png)


## runat="server"

**runat就是在server上執行編譯的過程**

瀏覽器(Browser)會用Get方式向Server取得第一次載入的資料
此時Page屬性IsPostBack=false；
後執行Page_Load程式。

之後當Browser觸發了一個按鈕Button後，不管這按扭元件的底下有沒有陳述句，ASP.net會Post的方式重新導向然後執行一次Server端程式碼，IsPostBack會變更為true。

**當使用者在瀏覽器(Browser)按下了一個按鈕，不管按鈕有沒有寫程式碼，程式預設會利用Post的方式重新導向再次執行一次Server端的程式碼。此時IsPostBack=true。**


在Form上加入 `runat="server"` 就可以進入Page_load

![](https://i.imgur.com/VHaYOAW.png)

---
---

## Button&事件

事件處理程式
onServerClick 一定要有 runat="server"

1. runat="server" 
2. onServerClick="ServeSideEvent"

如果form中有runat="server" 標籤
加上onServerClick 不會抱錯
但是不會觸發Click事件

```C#
<input id="Button1" type="submit" runat="server" onServerClick="ServeSideEvent" value="button" />
```

![](https://i.imgur.com/2RiYjao.png)








