Đang cố gắng sử dụng fileReader.readAsBinaryString để tải tệp PNG lên máy chủ thông qua AJAX, mã đã bị loại bỏ (tệpObject là đối tượng chứa thông tin trên tệp của tôi);
var fileReader = new FileReader();
fileReader.onload = function(e) {
var xmlHttpRequest = new XMLHttpRequest();
//Some AJAX-y stuff - callbacks, handlers etc.
xmlHttpRequest.open("POST", '/pushfile', true);
var dashes = '--';
var boundary = 'aperturephotoupload';
var crlf = "\r\n";
//Post with the correct MIME type (If the OS can identify one)
if ( fileObject.type == '' ){
filetype = 'application/octet-stream';
} else {
filetype = fileObject.type;
}
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(fileObject.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + e.target.result + crlf + dashes + boundary + dashes;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/form-data;boundary=" + boundary);
//Send the binary data
xmlHttpRequest.send(data);
}
fileReader.readAsBinaryString(fileObject);
Kiểm tra vài dòng đầu tiên của tệp trước khi tải lên (sử dụng VI) cho tôi
Cùng một tệp sau khi tải lên hiển thị
Vì vậy, có vẻ như một vấn đề về định dạng / mã hóa ở đâu đó, tôi đã thử sử dụng một hàm mã hóa UTF8 đơn giản trên dữ liệu nhị phân thô
function utf8encode(string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
)
Sau đó, trong mã gốc
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(file.file.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + utf8encode(e.target.result) + crlf + dashes + boundary + dashes;
cho tôi kết quả đầu ra là
Vẫn không phải là tệp thô = (
Tôi làm cách nào để mã hóa / tải / xử lý tệp để tránh các sự cố mã hóa, do đó, tệp đang nhận trong yêu cầu HTTP giống với tệp trước khi được tải lên.
Một số thông tin hữu ích có thể khác, nếu thay vì sử dụng fileReader.readAsBinaryString (), tôi sử dụng fileObject.getAsBinary () để lấy dữ liệu nhị phân, nó hoạt động tốt. Nhưng getAsBinary chỉ hoạt động trong Firefox. Tôi đã thử nghiệm điều này trong Firefox và Chrome, cả trên Mac, đều nhận được kết quả như nhau ở cả hai. Tải lên phần phụ trợ đang được xử lý bởi Mô-đun tải lên NGINX , một lần nữa chạy trên Mac. Máy chủ và máy khách trên cùng một máy. Điều tương tự cũng xảy ra với bất kỳ tệp nào tôi cố gắng tải lên, tôi chỉ chọn PNG vì đó là ví dụ rõ ràng nhất.
<input type="file">
lĩnh vực)