C# MVC防伪令牌赢得';通过AJAX发布时不允许多个文件上载
我知道上传多个文件很好,因为当我发表评论时C# MVC防伪令牌赢得';通过AJAX发布时不允许多个文件上载,c#,ajax,model-view-controller,csrf,antiforgerytoken,C#,Ajax,Model View Controller,Csrf,Antiforgerytoken,我知道上传多个文件很好,因为当我发表评论时 [ValidateAntiForgeryToken]我可以选择多个文件,它们将按预期上传而不会出现任何问题 但是,当我将[ValidateAntiForgeryToken]放回时,如果我选择了2个或多个文件,则会出现服务器500状态错误,并且不会上载任何文件 此外,我将添加错误: 加载资源失败:服务器响应状态为500(内部服务器错误)堆栈跟踪显示它在上载操作的第1行停止 但是,如果我选择1个文件,它将成功上载,并且我将获得状态代码200 我对这一点还相
[ValidateAntiForgeryToken]
我可以选择多个文件,它们将按预期上传而不会出现任何问题
但是,当我将[ValidateAntiForgeryToken]
放回时,如果我选择了2个或多个文件
,则会出现服务器500状态错误
,并且不会上载任何文件
此外,我将添加错误:
加载资源失败:服务器响应状态为500(内部服务器错误)
堆栈跟踪显示它在上载操作的第1行停止
但是,如果我选择1个文件,它将成功上载,并且我将获得状态代码200
我对这一点还相当陌生——我不知道出了什么问题。我非常感谢您对这个谜的帮助。:-)
这是我的控制器操作:
[HttpPost]
[ValidateAntiForgeryToken] // If I comment this out, everything works as intended
public ActionResult Upload()
{
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Some/FilePath"), fileName);
file.SaveAs(path);
}
return Json(new { success = true, responseText = "Success!" }, JsonRequestBehavior.AllowGet); //This is placeholder, I'll implement validation later
}
JQuery,AJAX。这是上传功能
function UploadAjax(storedFilesArray) {
var formData = new FormData();
for (let i = 0; i < storedFilesArray.length; i++) {
let file = storedFilesArray[i];
formData.append('__RequestVerificationToken', getToken()); //appends the value to the formData.
formData.append("file-upload", file);
}
$.ajax({
type: "POST",
dataType: 'json',
cache: false,
url: '/Home/Upload',
data: formData,
contentType: false,
processData: false,
success: function (response) {
...
},
error: function (response) {
...
}
});
}
将此线从回路中取出(并将其置于回路上方或下方):
append
将继续添加到提交到服务器的\u RequestVerificationToken
值。一旦附加到Once(即,如果选择了2个或更多文件),该值将不是有效的XSRF防伪令牌。然后它无法验证,因此服务器上会出现错误。将这一行从循环中取出(并将其置于循环的上方或下方):
append
将继续添加到提交到服务器的\u RequestVerificationToken
值。一旦附加到Once(即,如果选择了2个或更多文件),该值将不是有效的XSRF防伪令牌。然后它无法验证,因此您在服务器上得到一个错误。也许您应该设置formData.append(“'uu RequestVerificationToken',getToken())代码>超出周期
var formData = new FormData();
formData.append('__RequestVerificationToken', getToken()); //appends the value to the formData.
for (let i = 0; i < storedFilesArray.length; i++) {
let file = storedFilesArray[i];
formData.append("file-upload", file);
}
var formData=new formData();
append(“”“RequestVerificationToken”,getToken())//将值附加到formData。
for(设i=0;i
也许您应该设置formData.append(“'u RequestVerificationToken',getToken())代码>超出周期
var formData = new FormData();
formData.append('__RequestVerificationToken', getToken()); //appends the value to the formData.
for (let i = 0; i < storedFilesArray.length; i++) {
let file = storedFilesArray[i];
formData.append("file-upload", file);
}
var formData=new formData();
append(“”“RequestVerificationToken”,getToken())//将值附加到formData。
for(设i=0;i
由于所有文件都具有相同的文件名,因此只能获取最后一个文件。看起来就像上传了一个文件(最后一个)。检查上传的文件的大小,看看哪个在文件夹中。对不起,我应该告诉你。当我使用[ValidateAntiforgeryToken]选择多个文件时,我不会上载任何文件。只有当我选择1个文件时,我才能在相同的情况下上传它。我将更新帖子。:)请参见以下内容:由于所有文件都具有相同的文件名,因此只能获取最后一个文件。看起来就像上传了一个文件(最后一个)。检查上传的文件的大小,看看哪个在文件夹中。对不起,我应该告诉你。当我使用[ValidateAntiforgeryToken]选择多个文件时,我不会上载任何文件。只有当我选择1个文件时,我才能在相同的情况下上传它。我将更新帖子。:)看下面:哦,我的天!我很抱歉,我现在觉得自己很愚蠢,没有注意到这一点。非常感谢你-一双新鲜的眼睛走了很长的路:)现在我明白了这个问题。。。我发现这个问题没有反映实际问题。我是S.O.的新手。我该怎么做?>_@LiudvikasTaluntis很高兴这有帮助。就你的问题而言,没关系。您描述了您的问题,提供了必要的代码和复制步骤。别管它。仅仅因为问题很明显(和你想象的不同),现在并不能使这个问题无效。哦,我的上帝!我很抱歉,我现在觉得自己很愚蠢,没有注意到这一点。非常感谢你-一双新鲜的眼睛走了很长的路:)现在我明白了这个问题。。。我发现这个问题没有反映实际问题。我是S.O.的新手。我该怎么做?>_@LiudvikasTaluntis很高兴这有帮助。就你的问题而言,没关系。您描述了您的问题,提供了必要的代码和复制步骤。别管它。仅仅因为问题很明显(与您认为的不同),现在并不会使问题无效。感谢您注意到这一点。我认为那部分代码很好的假设对我不利><我真的很感谢你的帮助。:)不过,我不知道该怎么处理这个问题,因为它并没有反映出这个问题。我是将其更改为更相关的内容,还是将其删除?对S.O.和一般编程新手>(我不知道:)也许把问题标记为已回答。也许其他人也会犯类似的错误,在表单中多次添加\uu RequestVerificationToken
。我明白了:)再次感谢您的帮助-如果不解决这个问题,我就不会离开家了谢谢你注意到这一点。我认为那部分代码很好的假设对我不利><我真的很感谢你的帮助。:)不过,我不知道该怎么处理这个问题,因为它并没有反映出这个问题。我是将其更改为更相关的内容,还是将其删除?对S.O.和一般编程新手>(我不知道:)也许把问题标记为已回答。也许其他人也会犯类似的错误,在表单中多次添加\uu RequestVerificationToken
。我明白了:)再次感谢您的帮助-如果不解决这个问题,我就不会离开家了D
System.Web.Mvc.HttpAntiForgeryException: The anti-forgery token could not be
decrypted. If this application is hosted by a Web Farm or cluster, ensure that
all machines are running the same version of ASP.NET Web Pages and that the
<machineKey> configuration specifies explicit encryption and validation keys.
AutoGenerate cannot be used in a cluster.
formData.append('__RequestVerificationToken', getToken()); //appends the value to the formData.
var formData = new FormData();
formData.append('__RequestVerificationToken', getToken()); //appends the value to the formData.
for (let i = 0; i < storedFilesArray.length; i++) {
let file = storedFilesArray[i];
formData.append("file-upload", file);
}