我正在通过David Flanagan出色的书:JavaScript:The Definitive指南学习AJAX技巧。有一个关于文件上传的部分 使用HTTP POST请求。它说,我引用,“XHR2 API,允许您通过将File对象传递给send()来上传文件 方法”。
我会把David的示例片段放在这里然后我正在做什么[这几乎是一样的:
// Find all <input type="file"> elements with a data-uploadto attribute
// and register an onchange handler so that any selected file is
// automatically POSTED to the specified "uploadto" URL. The server's
// response is ignored.
whenReady(function() { // this function is defined elsewhere in the book. It serves the same purpose as jQuery(document).ready()
var elts = document.getElementsByTagName('input'); // all input elements
for(var i = 0; i < elts.length; i++){
var input = elts[i];
if(input.type !== "file") continue; // skip all but file upload elts
var url = input.getAttribute('data-uploadto'); // get upload url
if (!url) continue;
input.addEventListener('change', function(){ // when user selects a file
var file = this.files[0]; // assume a single file selection
if(!file) return; // If no file, do nothing
var xhr = new XMLHttpRequest(); // Create a new request
xhr.open('POST', url); // POST to the URL
xhr.send(file); // Send the file as body
}, false);
}
});
我试图用我的html中的<input type="file">
元素复制相同的想法。这就是我所拥有的,包括html页面底部的以下JavaScript:
<script>
var input = document.querySelector('input[type="file"]');
input.addEventListener('change', function(){
var imageFile = input.files[0];
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(request.readyState === XMLHttpRequest.DONE && request.status === 200) console.log('Image has been uploaded');
}
request.open('POST', /* I type here the url for the root directory of the site / html file I'm working with */);
request.send(imageFile);
});
</script>
注意:
所以我的问题是:这里的javascript有错误吗(我没有看到任何控制台错误)?或者,使用ajax的其他机制允许我上传图像?
感谢您的耐心等待。
答案 0 :(得分:0)
您应该使用FormData将文件发送到服务器。
var formData = new FormData();
formData.append("image", input.files[0]);
request.send(formData);
但是你需要服务器上的逻辑来读取文件并保存它。想想如果我们可以随意将任何文件推送到任何服务器会发生什么。
答案 1 :(得分:0)
解决这个问题的一种方法是使用FileReader(),这段代码会产生base64的图像。
var input = document.querySelector('input[type=file]');
input.onchange = function(e) {
var reader = new FileReader();
reader.onload = function(e) {
console.log(this.result);
}
reader.readAsDataURL(e.target.files[0]);
}
<input type="file"/>