【发布时间】:2014-09-22 00:13:50
【问题描述】:
我正在尝试将文件上传到 c# 中的通用 HttpHandler。我使用拖放事件获取文件:
$s("#dropArea")
.on("drop", function(e) {
e.preventDefault && e.preventDefault();
var file = e.originalEvent.dataTransfer.files[0];
var reader = new FileReader();
reader.onload = function(evt) {
$s.ajax({
url: MY_SERVER_URL,
type: "POST",
data: reader.result,
headers: {
"x-file-name": file.name
}
});
};
reader.readAsDataURL(file);
这似乎工作正常,但是当发布到 ashx 页面时,我尝试像这样解码图像:
var form = context.Request.Form[0];
var attachment = form.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)[1];
byte[] data = Convert.FromBase64String(attachment);
当我尝试将byte[] data 写入磁盘时,生成的文件不正确。我哪里错了?
edit:我也尝试过使用 FormData,但是 Request.Form 和 Request.Files 集合总是空的,我必须手动解析边界。这是我用来执行此操作的代码:
var formData = new FormData();
formData.append(file.name, file);
$s.ajax({
url: MY_SERVER_URL,
type: "POST",
data: formData,
processData: false,
contentType: 'multipart/form-data',
mimeType: 'multipart/form-data',
headers: {
"x-file-name": file.name
});
【问题讨论】:
-
那你为什么不像普通人一样,使用
formData对象来上传图片呢? -
@adeneo 因为我这样做时 Request.Form 集合总是空的。我在 jQuery 中将内容类型设置为“multipart/form-data”,它只是通过 Request.InputStream,然后需要我解析边界。
-
第二个,去掉headers,设置contentType为
false,看看是否有效。 -
@adeneo 谢谢,就是这样。为什么将 contentType 设置为 false 会改变它?我没有在 jquery 文档中看到描述该行为的地方。
-
将 contentType 设置为 false 会强制 jQuery 不添加 Content-Type 标头,并随后删除边界字符串,它必须设置为
false才能处理文件。
标签: c# javascript jquery html