通过jQuery上传文件后HttpPostedFile.ContentLength总是-2 AJAX
HttpPostedFile.ContentLength is always -2 after uploading files through jQuery AJAX
我对 jQuery AJAX 和 ASHX 行为有奇怪的问题。这是我的代码:
<input type="file" ID="FileUpload1" multiple="multiple" />
<input type="button" ID="Button1" Text="Upload Selected File(s)" />
function Upload() {
var data = new FormData();
jQuery.each($('#FileUpload1')[0].files, function (i, file) {
data.append('file-' + i, file);
});
$.ajax({
url: "/basic/fileupload/FileUploadHandler.ashx",
type: "POST",
contentType: false,
processData: false,
cache: false,
async: true,
data: data,
error: function (data) {
alert("Erro no envio de fotos do projecto. " + data.status);
}
});
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
try
{
string dirFullPath = HttpContext.Current.Server.MapPath("~/MediaUploader/");
string[] files;
int numFiles;
files = System.IO.Directory.GetFiles(dirFullPath);
numFiles = files.Length;
numFiles = numFiles + 1;
string str_image = "";
foreach (string s in context.Request.Files)
{
HttpPostedFile file = context.Request.Files[s];
string fileName = file.FileName;
string fileExtension = file.ContentType;
if (!string.IsNullOrEmpty(fileName))
{
fileExtension = System.IO.Path.GetExtension(fileName);
str_image = "MyPHOTO_" + numFiles.ToString() + fileExtension;
string pathToSave_100 = HttpContext.Current.Server.MapPath("~/files/") + str_image;
file.SaveAs(pathToSave_100);
}
}
// database record update logic here ()
context.Response.Write(str_image);
}
catch (Exception ac)
{
}
}
一切似乎都很好,但结果是:
context.Request.Files[0]
{System.Web.HttpPostedFile}
ContentLength: -2
ContentType: "image/png"
FileName: "icon-large.png"
InputStream: {System.Web.HttpInputStream}
我可以接收文件名,但 ContentLength
始终是 -2
,并且在保存文件后它的大小只有 0
字节。你能帮我解决这个问题吗?
更新:
我发现了一些新东西,它在 ASP.net 开发服务器上运行良好(运行 应用程序直接按 F5 键 Visual Studio)但是 IIS 8.5 配置有问题
还有我的web.config请求长度参数是:
<httpRuntime requestValidationMode="2.0" maxRequestLength="10240000" requestLengthDiskThreshold="10240000" />
更新 2:
将应用程序池的托管管道模式更改为经典模式将解决问题,但我将失去 URL 重写,因此无法更改我的管道模式。有什么想法吗?
我找到了解决这个问题的方法。我不知道是否可以,但解决了我的问题:
我用过
void Application_BeginRequest(object sender, EventArgs e)
在
global.asax
用于管理请求的文件,因为内容在那里是正确可见的。
还有其他想法吗?
我对 jQuery AJAX 和 ASHX 行为有奇怪的问题。这是我的代码:
<input type="file" ID="FileUpload1" multiple="multiple" />
<input type="button" ID="Button1" Text="Upload Selected File(s)" />
function Upload() {
var data = new FormData();
jQuery.each($('#FileUpload1')[0].files, function (i, file) {
data.append('file-' + i, file);
});
$.ajax({
url: "/basic/fileupload/FileUploadHandler.ashx",
type: "POST",
contentType: false,
processData: false,
cache: false,
async: true,
data: data,
error: function (data) {
alert("Erro no envio de fotos do projecto. " + data.status);
}
});
}
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
try
{
string dirFullPath = HttpContext.Current.Server.MapPath("~/MediaUploader/");
string[] files;
int numFiles;
files = System.IO.Directory.GetFiles(dirFullPath);
numFiles = files.Length;
numFiles = numFiles + 1;
string str_image = "";
foreach (string s in context.Request.Files)
{
HttpPostedFile file = context.Request.Files[s];
string fileName = file.FileName;
string fileExtension = file.ContentType;
if (!string.IsNullOrEmpty(fileName))
{
fileExtension = System.IO.Path.GetExtension(fileName);
str_image = "MyPHOTO_" + numFiles.ToString() + fileExtension;
string pathToSave_100 = HttpContext.Current.Server.MapPath("~/files/") + str_image;
file.SaveAs(pathToSave_100);
}
}
// database record update logic here ()
context.Response.Write(str_image);
}
catch (Exception ac)
{
}
}
一切似乎都很好,但结果是:
context.Request.Files[0]
{System.Web.HttpPostedFile}
ContentLength: -2
ContentType: "image/png"
FileName: "icon-large.png"
InputStream: {System.Web.HttpInputStream}
我可以接收文件名,但 ContentLength
始终是 -2
,并且在保存文件后它的大小只有 0
字节。你能帮我解决这个问题吗?
更新: 我发现了一些新东西,它在 ASP.net 开发服务器上运行良好(运行 应用程序直接按 F5 键 Visual Studio)但是 IIS 8.5 配置有问题
还有我的web.config请求长度参数是:
<httpRuntime requestValidationMode="2.0" maxRequestLength="10240000" requestLengthDiskThreshold="10240000" />
更新 2: 将应用程序池的托管管道模式更改为经典模式将解决问题,但我将失去 URL 重写,因此无法更改我的管道模式。有什么想法吗?
我找到了解决这个问题的方法。我不知道是否可以,但解决了我的问题:
我用过
void Application_BeginRequest(object sender, EventArgs e)
在
global.asax
用于管理请求的文件,因为内容在那里是正确可见的。 还有其他想法吗?