Ajax 文件上传处理程序在请求时始终为零
Ajax File Upload Handler always zero on request
我一直在通过 ajax 在网络表单上使用处理程序 (.ashx) 上传文件,但在处理程序上检索文件数据时遇到了一些问题
下面是我的javascript代码
$('#myImageButton').change(function (e) {
debugger;
var filename = $(this).val();
var lastIndex = filename.lastIndexOf("\");
if (lastIndex >= 0) {
filename = filename.substring(lastIndex + 1);
}
var fileUpload = $("#myImageButton").get(0);
var files = fileUpload.files;
var data = new FormData();
for (var i = 0; i < files.length; i++) {
data.append(files[i].name, files[i]);
}
$.ajax({
type: 'POST',
url: 'FileUploadHandler.ashx',
contentType: false,
processData: false,
data: "{ 'context': '" + data + "', 'flag': 'some_flag_here' }",
success: function (msg) {
alert(msg);
$('#tbImagePath2').val(filename);
},
error: function (xhr, status, error) {
debugger;
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
我检查了我的 javascript 代码,代码中有 none 个错误。
文件数据已正确填充
问题是当它调用处理程序(我的 ashx 文件)中的方法时,它在方法开始时遇到断点,这里是处理程序方法
public void ProcessRequest(HttpContext context)
{
if (context.Request.Files.Count > 0)
{
HttpFileCollection files = context.Request.Files;
string flag = context.Request["flag"].ToString();
string fname = String.Empty;
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
fname = context.Server.MapPath("~/Images/" + file.FileName);
file.SaveAs(fname);
switch (flag)
{
//some stuff here
}
}
}
//context.Response.ContentType = "text/plain";
//context.Response.Write("File(s) Uploaded Successfully!");
}
问题是上传的文件没有记录在上下文请求中,好像文件本身没有发送给处理程序来处理(计数始终为零)
在 ajax 上声明的标志也没有记录在上下文请求中
那么,如何让image/file和flag可以在请求中读取?
问候
平庸之辈
您在 ajax post 配置中设置 'data' 选项的方式似乎很奇怪。另外,尝试将 'flag' 添加到表单数据中。
试一试:
//...after adding your file(s)
data.append('flag','some_flag_here');
$.ajax({
url : 'FileUploadHandler.ashx',
type : 'POST',
data : data,
contentType : false,
processData : false,
//...etc
});
另一位小伙伴遇到了同样的问题,你可以see his solution here。
我一直在通过 ajax 在网络表单上使用处理程序 (.ashx) 上传文件,但在处理程序上检索文件数据时遇到了一些问题
下面是我的javascript代码
$('#myImageButton').change(function (e) {
debugger;
var filename = $(this).val();
var lastIndex = filename.lastIndexOf("\");
if (lastIndex >= 0) {
filename = filename.substring(lastIndex + 1);
}
var fileUpload = $("#myImageButton").get(0);
var files = fileUpload.files;
var data = new FormData();
for (var i = 0; i < files.length; i++) {
data.append(files[i].name, files[i]);
}
$.ajax({
type: 'POST',
url: 'FileUploadHandler.ashx',
contentType: false,
processData: false,
data: "{ 'context': '" + data + "', 'flag': 'some_flag_here' }",
success: function (msg) {
alert(msg);
$('#tbImagePath2').val(filename);
},
error: function (xhr, status, error) {
debugger;
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
我检查了我的 javascript 代码,代码中有 none 个错误。 文件数据已正确填充
问题是当它调用处理程序(我的 ashx 文件)中的方法时,它在方法开始时遇到断点,这里是处理程序方法
public void ProcessRequest(HttpContext context)
{
if (context.Request.Files.Count > 0)
{
HttpFileCollection files = context.Request.Files;
string flag = context.Request["flag"].ToString();
string fname = String.Empty;
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
fname = context.Server.MapPath("~/Images/" + file.FileName);
file.SaveAs(fname);
switch (flag)
{
//some stuff here
}
}
}
//context.Response.ContentType = "text/plain";
//context.Response.Write("File(s) Uploaded Successfully!");
}
问题是上传的文件没有记录在上下文请求中,好像文件本身没有发送给处理程序来处理(计数始终为零)
在 ajax 上声明的标志也没有记录在上下文请求中
那么,如何让image/file和flag可以在请求中读取?
问候
平庸之辈
您在 ajax post 配置中设置 'data' 选项的方式似乎很奇怪。另外,尝试将 'flag' 添加到表单数据中。
试一试:
//...after adding your file(s)
data.append('flag','some_flag_here');
$.ajax({
url : 'FileUploadHandler.ashx',
type : 'POST',
data : data,
contentType : false,
processData : false,
//...etc
});
另一位小伙伴遇到了同样的问题,你可以see his solution here。