HTTP에서의 File upload
: form에서의 post 방식을 통한 File을 업로드시키게 된다.
<form action="/home/uploadfiles" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
POST를 통해서 HTTP Header에 같이 넣어지는 데이터는 다음과 같다.
POST /home/uploadfiles HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 324
-----------------------------7d81b516112482
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\Documents\test.txt"
Content-Type: text/plain
foo
-----------------------------7d81b516112482
Content-Disposition: form-data; name="submit"
Submit
-----------------------------7d81b516112482--
POST를 통해서 이동되는 데이터에서는 하나 이상의 파일이 multipart/form-data를 통해서 얻어지는 것이 가능하게 된다. 또한 POST를 통해서 Header에 각각의 binary data가 저장되게 된다.
multipart/form-data를 통하지 않은 데이터는 다음과 같이 보여지게 된다.
POST /home/uploadfiles HTTP/1.1
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 13
submit=Submit
차이가 확연히 보이는 것을 알수 있다. File의 업로드 시에 필요한 File의 데이터에 대한 정보는 존재하지 않고 있다.ASP.NET에서의 FileUpload control의 경우에도 역시 form에서의 multipart/form-data를 통해서 데이터를 전송시키고 있다.
이때에 Http-Header의 정보에 있는 데이터를 얻어오는 방법은 다음과 같다.
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
if (hpf.ContentLength == 0)
continue;
string savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(hpf.FileName));
hpf.SaveAs(savedFileName);
요청되어진 Request에서 Files property는 multipart/form-data에서 얻어진 파일 이름과 그에 따른 File 값들로 구성되어진다. HttpPostedFileBase로 데이터를 받아서 서버단이나 원하는 위치에 지정하게 되면 저장되게 된다.
이러한 방법은 ASP.NET 또는 MVC 모델에서 뿐 아니라, HTTP단에서 Post를 이용한 데이터의 전송시에 항시 사용되는 방법이 된다.