使用 ASP.NET MVC 进行多个文件上传jQuery 多文件上传插件
我正在使用 jQuery 多文件上传插件来上传多张图片。但表单仅发布 1 个顶部项目。 Fiddler(POST):
POST /Images/UploadImages HTTP/1.1
Host: localhost:4793
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:4793/images
Cookie: .ASPXAUTH=EFAC4E03FA49056788028048AE1B099D3EB6D1D61AFB8E830C117297471D5689EC52EF40C7FE2CEF98FF6B7C8CAD3AB741A5E78F447AB361A2BDD501331A88C7B75120611CEA4FECA40D972BB9401472
Content-Type: multipart/form-data; boundary=---------------------------1509898581730
Content-Length: 290022
-----------------------------1509898581730
Content-Disposition: form-data; name="album"
1
-----------------------------1509898581730
Content-Disposition: form-data; name="file[]"; filename="Blue hills.jpg"
Content-Type: image/jpeg
...
这是我的代码:
<% using (Html.BeginForm("UploadImages", "Images", FormMethod.Post, new { enctype = "multipart/form-data"}))
{%>
<%= Html.DropDownList("album", (IEnumerable<SelectListItem>)ViewData["Albums"])%>
<br />
<input type="file" name="file[]" id="file" class="multi" accept="jpg|png" />
<br />
<input type="submit" name="submit" value="Submit" />
<% } %>
和控制器的代码:
public ActionResult UploadImages(FormCollection formValue)
{
foreach (string file in Request.Files)
{
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
if (hpf.ContentLength == 0)
continue;
//do something with file
}
return RedirectToAction("Index");
}
请告诉我如何解决问题。也许您可以建议其他方式让用户上传多张图像。蒂亚
PS。除了 sript 控件生成的 html 代码之外:
<input id="file" class="multi" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F1" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F2" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F3" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F4" class="multi MultiFile" type="file" accept="jpg|png" name="file[]"/>
I'm using jQuery Multiple File Upload Plugin to upload several pictures. But form posts only 1, top, item. Fiddler (POST):
POST /Images/UploadImages HTTP/1.1
Host: localhost:4793
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:4793/images
Cookie: .ASPXAUTH=EFAC4E03FA49056788028048AE1B099D3EB6D1D61AFB8E830C117297471D5689EC52EF40C7FE2CEF98FF6B7C8CAD3AB741A5E78F447AB361A2BDD501331A88C7B75120611CEA4FECA40D972BB9401472
Content-Type: multipart/form-data; boundary=---------------------------1509898581730
Content-Length: 290022
-----------------------------1509898581730
Content-Disposition: form-data; name="album"
1
-----------------------------1509898581730
Content-Disposition: form-data; name="file[]"; filename="Blue hills.jpg"
Content-Type: image/jpeg
...
Here is my code:
<% using (Html.BeginForm("UploadImages", "Images", FormMethod.Post, new { enctype = "multipart/form-data"}))
{%>
<%= Html.DropDownList("album", (IEnumerable<SelectListItem>)ViewData["Albums"])%>
<br />
<input type="file" name="file[]" id="file" class="multi" accept="jpg|png" />
<br />
<input type="submit" name="submit" value="Submit" />
<% } %>
And controller's code:
public ActionResult UploadImages(FormCollection formValue)
{
foreach (string file in Request.Files)
{
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
if (hpf.ContentLength == 0)
continue;
//do something with file
}
return RedirectToAction("Index");
}
Please advise me how to solve the issue. Maybe you can advise other way to let user upload several images. TIA
PS. Besides html code of generated by the sript controls:
<input id="file" class="multi" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F1" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F2" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F3" class="multi MultiFile" type="file" accept="jpg|png" name="file[]" style="position: absolute; top: -3000px;"/>
<input id="file_F4" class="multi MultiFile" type="file" accept="jpg|png" name="file[]"/>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我找到了解决方案。答案是将 HttpPostedFileBase 更改为 IEnumerable(如果您要上传多个文件)。
我遇到了和你上面一样的问题。这解决了我的问题。这里还有一个很好的链接:Phil Haacks 的帖子
I found a solution. The answer was to change the HttpPostedFileBase to an IEnumerable (if you are uploading multiple files).
I had the same problem(s) as you above. This solved my problem. Here is a good link too:Phil Haacks's post
问题是您正在尝试访问一个包含相同索引的数组,因为 POST 提交正在获取具有相同名称的文件数组。
而不是
使用
The problem was you are trying to access an array which contains same index as the POST submit is obtaining an array of files with same name.
Instead of
use
您应该能够绑定到一个列表。
你的观点应该有
You should be able to bind to a list.
and your view should have
在 HTML5 中,您可以使用单个文件上传字段上传多个文件:
在这种情况下,您的操作方法可能类似于:
In HTML5, you can upload multiple files with a single file upload field:
In that case, your action method can be something like:
我认为问题是生成的 HTML 中的名称 file[] 。显然,从插件方面来看,这个 si 工作得不好。
有时扭转正确的行为才是有效的。尝试从名称中删除“[]”并查看。
实际上,因为您没有按名称使用输入字段。您可以保留名称未设置,类似于插件的主页示例。
尝试一下。
I think the problem is the name file[] in the generated HTML. Clearly this si not working well from the plug-in side.
Sometimes reversing the right behavior is what works. Try to remove "[]" from the name and see.
Actually, since you are not using the input fields by name. You can leave the name unset similar to the homepage examples of the plug-in.
Give it a try.
我已经找到了应定义“namePattern”属性以便生成具有不同名称的输入。
例如:
不过,还是谢谢你的帮助。
I've found. The 'namePattern' property should be defined in order to generate inputs with different name.
For ex.:
Nevertheless, thank you for your help.
您可以查看此处来自 Phil Haack 的解决方案。
在视图上
在控制器上
You can look here a solution from Phil Haack.
On the view
On Controller
使用 jquery ajax 和 .net MVC 发布许多文件:
在视图中:
在 js 中:
控制器中:
Posting many file with jquery ajax and .net MVC:
In View:
In js:
Controller:
视图
控制器
view
Controller