잊지 않겠습니다.

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를 이용한 데이터의 전송시에 항시 사용되는 방법이 된다.


Posted by Y2K
,