原代碼嘗試將 FormData 物件序列化為 JSON,導致圖片二進位資料遺失:
var jsonData = {"name": name, "img": formdata, ...};
jsonData = JSON.stringify(jsonData); // FormData 變成空物件 {}
$.post("url", jsonData, ...);
JSON.stringify FormDataprocessData: false、contentType: falseformdata.append() 加入<form id="uploadForm" enctype="multipart/form-data">
<input type="text" id="name" placeholder="寶貝暱稱" />
<select id="year"><option value="2014">2014</option></select>
<select id="month"><option value="4">4</option></select>
<input type="text" id="mobile" placeholder="手機" />
<input type="text" id="qq" placeholder="QQ" />
<textarea name="desc" placeholder="描述"></textarea>
<input type="file" id="input-file-now" multiple />
<button type="submit">提交</button>
</form>
<script>
$('#uploadForm').on('submit', function(e) {
e.preventDefault();
var formdata = new FormData(this); // 自動收集表單所有欄位
// 如果需要額外處理檔案
var files = $('#input-file-now')[0].files;
for (var i = 0; i < files.length; i++) {
formdata.append('fileList', files[i]); // 附加二進位檔案
}
$.ajax({
url: '/api/upload',
type: 'POST',
data: formdata,
processData: false, // 關鍵:不處理資料
contentType: false, // 關鍵:不設定 Content-Type,讓瀏覽器自動加 boundary
success: function(res) {
console.log('上傳成功', res);
},
error: function(xhr) {
console.error('上傳失敗', xhr.responseText);
}
});
});
</script>
[HttpPost]
public async Task<IActionResult> Upload(
string name,
string birthday,
string mobile,
string qq,
string desc,
List<IFormFile> fileList)
{
foreach (var file in fileList) {
if (file.Length > 0) {
var path = Path.Combine(_env.WebRootPath, "uploads", file.FileName);
using (var stream = new FileStream(path, FileMode.Create)) {
await file.CopyToAsync(stream);
}
}
}
return Ok(new { message = "上傳成功" });
}
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener('progress', function(e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
$('#progressBar').css('width', percent + '%').text(percent + '%');
}
});
return xhr;
},
// ... 其他設定
});
| 錯誤現象 | 原因 | 修正 |
|---|---|---|
| 後端收到空檔案 | 未設定 processData: false | 加上該選項 |
| Content-Type 錯誤 | 手動設定 application/json | 設為 false 讓瀏覽器自動產生 multipart/form-data; boundary=... |
| 中文檔名亂碼 | 瀏覽器編碼不一 | 後端用 HttpUtility.UrlDecode 或 RFC 5987 編碼 |
