@@ -9,6 +9,11 @@ namespace jQuery_File_Upload.MVC3.Controllers
9
9
{
10
10
public class HomeController : Controller
11
11
{
12
+ private string StorageRoot
13
+ {
14
+ get { return Path . Combine ( Server . MapPath ( "~/Files" ) ) ; }
15
+ }
16
+
12
17
public ActionResult Index ( )
13
18
{
14
19
return View ( ) ;
@@ -52,26 +57,22 @@ public ActionResult UploadFiles()
52
57
53
58
foreach ( string file in Request . Files )
54
59
{
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 ;
60
62
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" ] ) )
65
64
{
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
+ }
73
71
74
- } ) ;
72
+ JsonResult result = Json ( statuses ) ;
73
+ result . ContentType = "text/plain" ;
74
+
75
+ return result ;
75
76
}
76
77
77
78
return Json ( r ) ;
@@ -81,6 +82,59 @@ private string EncodeFile(string fileName)
81
82
{
82
83
return Convert . ToBase64String ( System . IO . File . ReadAllBytes ( fileName ) ) ;
83
84
}
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
+ }
84
138
}
85
139
86
140
public class ViewDataUploadFilesResult
0 commit comments