admin管理员组文章数量:1241125
I try to make an image-upload functionality similar to the one GMail uses. You copy (CTRL-C) an image from your desktop and paste (CTRL-V) it onto the website. The image is then uploaded via a XMLHttpRequest to a php-script that handles the ining file, whereby "handling" means renaming and storing on the server.
I can already fetch the image (and -data), but I am unable to successfully submit and receive the XMLHttpRequest. My Javascript code looks like that:
document.onpaste = function(e){
var items = e.clipboardData.items;
console.log(JSON.stringify(items));
if (e.clipboardData.items[1].kind === 'file') {
// get the blob
var imageFile = items[1].getAsFile();
console.log(imageFile);
var reader = new FileReader();
reader.onload = function(event) {
console.log(event.target.result); // data url!
submitFileForm(event.target.result, 'paste');
};
}
};
function submitFileForm(file, type) {
var formData = new FormData();
formData.append('file', file);
formData.append('submission-type', type);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'php/image-upload.php');
xhr.onload = function () {
if (xhr.status == 200) {
console.log('all done: ');
} else {
console.log('Nope');
}
};
xhr.send(formData);
}
The handling php (php/image-upload.php
) looks like that:
$base64string = $_POST['file'];
file_put_contents('img.png', base64_decode($base64string));
I think the $_POST['file']
stays empty, but I am not sure.
What's more, I also encounter the "blob size" (displayed with console.log()) is way larger than the actual image size. But maybe that's no matter or caused by encodings.
The developer console displays this.
{"0":{"type":"text/plain","kind":"string"},"1":{"type":"image/png","kind":"file"},"length":2} image-upload.js:8
Blob {type: "image/png", size: 135619, slice: function}
If I view the file-info by right-clicking the actual image file, it shows 5,320 bytes (8 KB on disk)
in size.
I do not necessarily need to use a XMLHttpRequest
, it was just what came to my mind first. If there's a better way of achieving realtime image-uploading to a server with javascript, please let us know.
I try to make an image-upload functionality similar to the one GMail uses. You copy (CTRL-C) an image from your desktop and paste (CTRL-V) it onto the website. The image is then uploaded via a XMLHttpRequest to a php-script that handles the ining file, whereby "handling" means renaming and storing on the server.
I can already fetch the image (and -data), but I am unable to successfully submit and receive the XMLHttpRequest. My Javascript code looks like that:
document.onpaste = function(e){
var items = e.clipboardData.items;
console.log(JSON.stringify(items));
if (e.clipboardData.items[1].kind === 'file') {
// get the blob
var imageFile = items[1].getAsFile();
console.log(imageFile);
var reader = new FileReader();
reader.onload = function(event) {
console.log(event.target.result); // data url!
submitFileForm(event.target.result, 'paste');
};
}
};
function submitFileForm(file, type) {
var formData = new FormData();
formData.append('file', file);
formData.append('submission-type', type);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'php/image-upload.php');
xhr.onload = function () {
if (xhr.status == 200) {
console.log('all done: ');
} else {
console.log('Nope');
}
};
xhr.send(formData);
}
The handling php (php/image-upload.php
) looks like that:
$base64string = $_POST['file'];
file_put_contents('img.png', base64_decode($base64string));
I think the $_POST['file']
stays empty, but I am not sure.
What's more, I also encounter the "blob size" (displayed with console.log()) is way larger than the actual image size. But maybe that's no matter or caused by encodings.
The developer console displays this.
{"0":{"type":"text/plain","kind":"string"},"1":{"type":"image/png","kind":"file"},"length":2} image-upload.js:8
Blob {type: "image/png", size: 135619, slice: function}
If I view the file-info by right-clicking the actual image file, it shows 5,320 bytes (8 KB on disk)
in size.
I do not necessarily need to use a XMLHttpRequest
, it was just what came to my mind first. If there's a better way of achieving realtime image-uploading to a server with javascript, please let us know.
- what does the network tab of your developer console shows. is the file being actually submitted over the wire or an empty form is being sent. – DevZer0 Commented Aug 5, 2013 at 10:06
-
your
reader.onload = function(event) { console.log(event.target.result); // data url! submitFileForm(event.target.result, 'paste'); };
function is not firing. – DevZer0 Commented Aug 5, 2013 at 10:19
4 Answers
Reset to default 11 +150you copy (CTRL-C) an image from your desktop and paste (CTRL-V) it onto the website.
No, that is impossible. What you can paste is e.g. screenshots and images from the web, that's what gmail does.
Your biggest mistake is using FileReader when you already have a file, the $_FILES
array is filled when there is a proper HTTP upload not for ad hoc base64 POST param. To do a proper HTTP upload, you just .append()
a file or blob object (File
s are Blob
s).
This is a stand-alone PHP file that should just work, host the file, open it is a page, take a screenshot, then paste it while on the page and after a few seconds the image should appear on the page.
<?php
if( isset( $_FILES['file'] ) ) {
$file_contents = file_get_contents( $_FILES['file']['tmp_name'] );
header("Content-Type: " . $_FILES['file']['type'] );
die($file_contents);
}
else {
header("HTTP/1.1 400 Bad Request");
}
print_r($_FILES);
?>
<script>
document.onpaste = function (e) {
var items = e.clipboardData.items;
var files = [];
for( var i = 0, len = items.length; i < len; ++i ) {
var item = items[i];
if( item.kind === "file" ) {
submitFileForm(item.getAsFile(), "paste");
}
}
};
function submitFileForm(file, type) {
var extension = file.type.match(/\/([a-z0-9]+)/i)[1].toLowerCase();
var formData = new FormData();
formData.append('file', file, "image_file");
formData.append('extension', extension );
formData.append("mimetype", file.type );
formData.append('submission-type', type);
var xhr = new XMLHttpRequest();
xhr.responseType = "blob";
xhr.open('POST', '<?php echo basename(__FILE__); ?>');
xhr.onload = function () {
if (xhr.status == 200) {
var img = new Image();
img.src = (window.URL || window.webkitURL)
.createObjectURL( xhr.response );
document.body.appendChild(img);
}
};
xhr.send(formData);
}
</script>
i have posted a full working example. The problem before was you needed to construct the blob properly. by injecting the file data inside an array notation
document.onpaste = function(e){
var items = e.clipboardData.items;
console.log(JSON.stringify(items));
if (e.clipboardData.items[0].kind === 'file') {
// get the blob
var imageFile = items[0].getAsFile();
console.log(imageFile);
var reader = new FileReader();
reader.onload = function(event) {
console.log(event.target.result); // data url!
submitFileForm(event.target.result, 'paste');
};
reader.readAsBinaryString(imageFile);
}
};
function submitFileForm(file, type) {
var formData = new FormData();
var myBlob = new Blob([file], { "type" : "image/png"} );
formData.append('file', myBlob, 'file.jpg');
formData.append('submission-type', type);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/task/file');
xhr.onload = function () {
if (xhr.status == 200) {
console.log('all done: ');
} else {
console.log('Nope');
}
};
xhr.send(formData);
}
Is it possible that the image file size is greater than your 'upload_max_filesize' setting?(usually defaults to 2 meg)
I guess the file is in the $_FILE array not in the $_POST since it is a file. If not, you may convert the image to a string an send the imagestring as GET request.
本文标签: How to receive php image data over copynpaste javascript with XMLHttpRequestStack Overflow
版权声明:本文标题:How to receive php image data over copy-n-paste javascript with XMLHttpRequest - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1740020742a2220766.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论