@@ -9,6 +9,11 @@ namespace jQuery_File_Upload.MVC3.Controllers
99{
1010 public class HomeController : Controller
1111 {
12+ private string StorageRoot
13+ {
14+ get { return Path . Combine ( Server . MapPath ( "~/Files" ) ) ; }
15+ }
16+
1217 public ActionResult Index ( )
1318 {
1419 return View ( ) ;
@@ -52,26 +57,22 @@ public ActionResult UploadFiles()
5257
5358 foreach ( string file in Request . Files )
5459 {
55- var hpf = Request . Files [ file ] as HttpPostedFileBase ;
56- if ( hpf . ContentLength == 0 || hpf . FileName == null )
57- continue ;
58-
59- var filename = Guid . NewGuid ( ) + Path . GetFileName ( hpf . FileName ) ;
60+ var statuses = new List < ViewDataUploadFilesResult > ( ) ;
61+ var headers = Request . Headers ;
6062
61- var filepath = Path . Combine ( Server . MapPath ( "~/Files" ) , filename ) ;
62- hpf . SaveAs ( filepath ) ;
63-
64- r . Add ( new ViewDataUploadFilesResult ( )
63+ if ( string . IsNullOrEmpty ( headers [ "X-File-Name" ] ) )
6564 {
66- name = hpf . FileName ,
67- size = hpf . ContentLength ,
68- type = hpf . ContentType ,
69- url = "/Home/Download/" + filename ,
70- delete_url = "/Home/Delete/" + filename ,
71- delete_type = "GET" ,
72- thumbnail_url = @"data:image/png;base64," + EncodeFile ( filepath )
65+ UploadWholeFile ( Request , statuses ) ;
66+ }
67+ else
68+ {
69+ UploadPartialFile ( headers [ "X-File-Name" ] , Request , statuses ) ;
70+ }
7371
74- } ) ;
72+ JsonResult result = Json ( statuses ) ;
73+ result . ContentType = "text/plain" ;
74+
75+ return result ;
7576 }
7677
7778 return Json ( r ) ;
@@ -81,6 +82,59 @@ private string EncodeFile(string fileName)
8182 {
8283 return Convert . ToBase64String ( System . IO . File . ReadAllBytes ( fileName ) ) ;
8384 }
85+
86+ //Credit to i-e-b and his ASP.Net uploader for the bulk of the upload helper methods - https://github.com/i-e-b/jQueryFileUpload.Net
87+ private void UploadPartialFile ( string fileName , HttpRequestBase request , List < ViewDataUploadFilesResult > statuses )
88+ {
89+ if ( request . Files . Count != 1 ) throw new HttpRequestValidationException ( "Attempt to upload chunked file containing more than one fragment per request" ) ;
90+ var file = request . Files [ 0 ] ;
91+ var inputStream = file . InputStream ;
92+ var fullName = Path . Combine ( StorageRoot , Path . GetFileName ( fileName ) ) ;
93+
94+ using ( var fs = new FileStream ( fullName , FileMode . Append , FileAccess . Write ) )
95+ {
96+ var buffer = new byte [ 1024 ] ;
97+
98+ var l = inputStream . Read ( buffer , 0 , 1024 ) ;
99+ while ( l > 0 )
100+ {
101+ fs . Write ( buffer , 0 , l ) ;
102+ l = inputStream . Read ( buffer , 0 , 1024 ) ;
103+ }
104+ fs . Flush ( ) ;
105+ fs . Close ( ) ;
106+ }
107+ statuses . Add ( new ViewDataUploadFilesResult ( )
108+ {
109+ name = fileName ,
110+ size = file . ContentLength ,
111+ type = file . ContentType ,
112+ url = "/Home/Download/" + fileName ,
113+ delete_url = "/Home/Delete/" + fileName ,
114+ delete_type = "GET" ,
115+ } ) ;
116+ }
117+
118+ //Credit to i-e-b and his ASP.Net uploader for the bulk of the upload helper methods - https://github.com/i-e-b/jQueryFileUpload.Net
119+ private void UploadWholeFile ( HttpRequestBase request , List < ViewDataUploadFilesResult > statuses )
120+ {
121+ for ( int i = 0 ; i < request . Files . Count ; i ++ )
122+ {
123+ var file = request . Files [ i ] ;
124+ file . SaveAs ( Path . Combine ( StorageRoot , Path . GetFileName ( file . FileName ) ) ) ;
125+
126+ string fullName = Path . GetFileName ( file . FileName ) ;
127+ statuses . Add ( new ViewDataUploadFilesResult ( )
128+ {
129+ name = file . FileName ,
130+ size = file . ContentLength ,
131+ type = file . ContentType ,
132+ url = "/Home/Download/" + file . FileName ,
133+ delete_url = "/Home/Delete/" + file . FileName ,
134+ delete_type = "GET" ,
135+ } ) ;
136+ }
137+ }
84138 }
85139
86140 public class ViewDataUploadFilesResult
0 commit comments