Javascript 上传带有预览的图像
Im正在为论坛用户创建上传功能,以便他们可以上传个人图片。到目前为止,我得到的是: HTMLJavascript 上传带有预览的图像,javascript,jquery,html,css,Javascript,Jquery,Html,Css,Im正在为论坛用户创建上传功能,以便他们可以上传个人图片。到目前为止,我得到的是: HTML <label>Profile image</label> <div class="photo" id="photoPreview"></div> <input type="file" value="forumPhoto" onchange="return changePhoto(this);"> Profile图像 JAVASCRIPT f
<label>Profile image</label>
<div class="photo" id="photoPreview"></div>
<input type="file" value="forumPhoto" onchange="return changePhoto(this);">
Profile图像
JAVASCRIPT
function showPhotoPreview() {
var photoUrl = $.trim($("#photo").val());
var img = $("#photoPreview img");
if (photoUrl != "") {
if (img.length == 0) {
img = $("<img />").appendTo($("#photoPreview"));
}
img.prop("src", photoUrl);
}
else {
img.remove();
}
}
function changePhoto(sender) {
var value = $(sender).val();
sender.selectedIndex = 0;
switch (value) {
case "upload":
assignPicture();
break;
}
showPhotoPreview();
return false;
}
function assignPicture() {
var forumPhoto = $("#forumPhoto").val();
if (forumPhoto == "") {
alert("You must specify an address to use forumPhoto.");
return;
}
$("#photo").val(forumPhoto);
}
函数showPhotoPreview(){
var photoUrl=$.trim($(“#photo”).val();
var img=$(“#照片预览img”);
如果(photoUrl!=“”){
如果(img.length==0){
img=$(”
目前的问题是,它没有显示在预览图片中。
jshiddle:请试一试
HTML:
你要么需要HTML5(文件阅读器),要么需要Flash来完成你想要做的事情。
简单地说,Javascript/iFrame具有防止处理本地用户文件和在浏览器中查看这些文件的安全性,以防止恶意使用
对于一个使用Mootools 1.3.2的工作示例,您可以自由地将其转换为jQuery。为了处理请求,我必须重写XHR方法,因此您很可能需要对jQuery执行同样的操作。请注意,我检查了FileReader,并删除了不使用它的预览功能
您还可以调整window.FormData方法,以简化上载过程,并在成功时使用服务器源更新映像
HTML:
预览
上传
预览图像:
答复:
Javascript:
//<![CDATA[
Request.implement({
options: {
form: null
},
sendFile: function(options){
if (!this.check(options)) return this;
this.options.isSuccess = this.options.isSuccess || this.isSuccess;
this.running = true;
var type = typeOf(options);
if (type == 'string' || type == 'element') options = {data: options};
var old = this.options;
options = Object.append({data: old.data, url: old.url, method: old.method, form: old.form, sendAsBinary: old.sendAsBinary}, options);
var data = options.data, url = String(options.url);
if (!url) url = document.location.pathname;
var trimPosition = url.lastIndexOf('/');
if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
if (this.options.noCache)
url += (url.contains('?') ? '&' : '?') + String.uniqueID();
var xhr = this.xhr;
xhr.open("POST", url, this.options.async, this.options.user, this.options.password);
if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
xhr.onreadystatechange = this.onStateChange.bind(this);
Object.each(this.headers, function(value, key){
try {
xhr.setRequestHeader(key, value);
} catch (e){
this.fireEvent('exception', [key, value]);
}
}, this);
this.fireEvent('request');
if(options.form){
data = new FormData();
options.form.getChildren('input').each(function(el){
var name = el.get('name'),
value = (el.get('type') == 'file')? el.files[0] : el.get('value');
data.append(name, value);
});
}
xhr.send(data);
if (!this.options.async) this.onStateChange();
if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
return this;
}
});
addEvent('domready', function(){
var preview = $('preview'),
output = $('output'),
info = $('info'),
previewWrapper = $('previewWrapper'),
responseWrapper = $('responseWrapper'),
previewBtn = $('previewBtn'),
imageToUpload = $('imageToUpload'),
wrapper = $('wrapper'),
uploadBtn = $('uploadBtn'),
bothBtns = new Elements([uploadBtn, previewBtn]),
isFileReader = true,
fileTypes = {
'jpeg' : true,
'png' : true,
'bmp' : true,
'jpg': true
},
fileToUpload = null,
maxSize = 2986000,
initReader = function(){
if(!isFileReader)
return false;
var reader = new FileReader();
//Chrome doesn't initiatize this - so onload only occurs when the object is created.
reader.onload = function () {
preview.set('src', reader.result);
preview.setStyle('display', 'inline');
};
return reader;
},
testFile = function(fileToUpload){
if(!(fileTypes[fileToUpload.type.replace('image/', '')])){
alert('Please select a valid image.');
return false;
}
if(fileToUpload.size > maxSize){
alert('Filesize limit of ' + maxSize + ' exceeded.');
return false;
}
return true;
},
getPreview = function(e){
bothBtns.set('disabled', 'disabled');
preview.set('src', '/assets/img/pixel.gif');
fileToUpload = $('imageToUpload').files[0];
if(!fileToUpload)
return true;
info.set('html', '<ul><li><strong>'+ fileToUpload.name + '</strong> (' + (fileToUpload.type || 'N/A') + ') ' + fileToUpload.size + ' bytes</li></ul>');
if(testFile(fileToUpload)){
bothBtns.removeProperty('disabled');
var reader = initReader();
if(!reader)
return true;
reader.readAsDataURL(fileToUpload);
if(e && e.type != 'submit'){
var scroll = previewWrapper.getPosition().y;
scrollFx.start(0, scroll);
}
return true;
}
return false;
},
scrollFx = new Fx.Scroll(window, {wheelStops: false}),
myRequest = new Request({
url: 'processFile.php',
headers: {
'Sender' : 'XMLHttpRequest'
},
onRequest: function(){
output.set('html', "<p>Loading...</p>");
var scroll = responseWrapper.getPosition().y;
scrollFx.start(0, scroll);
},
onSuccess: function(text){
var scroll = responseWrapper.getPosition().y;
scrollFx.start(0, scroll);
output.set('html', text);
}
});
if(typeof(window.FormData) === 'undefined'){
$$('#ajaxFileForm, hr, #responseWrapper').dispose();
wrapper.set('html', '<p>Your browser does not support FormData - For XHR File Uploads</p>');
return;
}
if(typeof(window.FileReader) === 'undefined'){
isFileReader = false;
previewBtn.dispose();
previewWrapper.set('html', '<p>Your browser does not support File API - For Previews</p>');
}
$('ajaxFileForm').addEvent('submit', function(e){
e.stop();
if(!getPreview(e))
return false;
responseWrapper.setStyle('display', 'block');
var formData = $('ajaxFileForm');
myRequest.sendFile({form: formData});
});
imageToUpload.addEvent('change', getPreview);
previewBtn.addEvent('click', getPreview);
getPreview();
});
//]]>
/-1&&(trimPosition=url.indexOf('#'))>-1)url=url.substr(0,trimPosition);
if(this.options.noCache)
url+=(url.contains(“?”)?”&“:“?”)+String.uniqueID();
var xhr=this.xhr;
打开(“POST”、url、this.options.async、this.options.user、this.options.password);
如果(xhr中的this.options.user&&“withCredentials”)xhr.withCredentials=true;
xhr.onreadystatechange=this.onStateChange.bind(this);
Object.each(this.headers,函数(值,键){
试一试{
setRequestHeader(键、值);
}捕获(e){
this.firevent('exception',[key,value]);
}
},这个);
此.firevent(“请求”);
if(options.form){
数据=新表单数据();
options.form.getChildren('input')。每个(函数(el){
var name=el.get('name'),
value=(el.get('type')='file')?el.files[0]:el.get('value');
数据。追加(名称、值);
});
}
发送(数据);
如果(!this.options.async)this.onStateChange();
如果(this.options.timeout)this.timer=this.timeout.delay(this.options.timeout,this);
归还这个;
}
});
addEvent('domready',function(){
变量预览=$(“预览”),
输出=$(“输出”),
info=$('info'),
PreviewRapper=$('PreviewRapper'),
responseWrapper=$('responseWrapper'),
previewBtn=$('previewBtn'),
imageToUpload=$('imageToUpload'),
包装器=$(“包装器”),
uploadBtn=$('uploadBtn'),
bothBtns=新元素([uploadBtn,previewBtn]),
isFileReader=true,
文件类型={
“jpeg”:正确,
‘png’:对,
“bmp”:对,
‘jpg’:对
},
fileToUpload=null,
maxSize=2986000,
initReader=函数(){
如果(!isFileReader)
返回false;
var reader=new FileReader();
//Chrome不会初始化此操作,因此只有在创建对象时才会发生onload。
reader.onload=函数(){
preview.set('src',reader.result);
preview.setStyle('display','inline');
};
返回读取器;
},
testFile=函数(fileToUpload){
if(!(文件类型[fileToUpload.type.replace('image/,'')){
警报('请选择有效的图像');
返回false;
}
如果(fileToUpload.size>maxSize){
警报('超过'+maxSize+'的文件大小限制');
返回false;
}
返回true;
},
getPreview=函数(e){
bothBtns.set('disabled','disabled');
preview.set('src','/assets/img/pixel.gif');
fileToUpload=$('imageToUpload')。文件[0];
如果(!fileToUpload)
返回true;
info.set('html','- '+fileToUpload.name+'('+(fileToUpload.type | | | N/A')+'+fileToUpload.size+'字节
);
if(testFile(fileToUpload)){
bothBtns.removeProperty(“已禁用”);
var reader=initReader();
如果(!读卡器)
返回true;
reader.readAsDataURL(fileToUpload);
如果(e&&e.type!=“提交”){
var scroll=previewRapper.getPosition().y;
scrollFx.start(0,滚动);
}
返回true;
}
返回false;
},
scrollFx=new Fx.Scroll(窗口,{wheelStops:false}),
myRequest=新请求({
url:'processFile.php',
H
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$('#img').attr('src', e.target.result;)
}
reader.readAsDataURL(input.files[0]);
}
}
$('#imgInput').change(function() {
readURL(this);
});
<div id="wrapper">
<form id="ajaxFileForm" method="post" action="processFile.php" enctype="multipart/form-data">
<input id="imageToUpload" name="file" type="file"><br>
<input name="somefield" type="text" value="Hello World"><br>
<button id="previewBtn" type="button" disabled="">Preview</button>
<button id="uploadBtn" type="submit" disabled="">Upload</button>
</form>
<div id="previewWrapper">
<h4>Preview Image:</h4>
<img style="display:none;" src="/assets/img/pixel.gif" id="preview" alt="Image Preview">
<div id="info"></div>
</div>
<hr style="height:1px; border:0; background: #666;">
<div id="responseWrapper" style="display: none">
<h4>Response:</h4>
<div id="output"></div>
</div>
</div>
//<![CDATA[
Request.implement({
options: {
form: null
},
sendFile: function(options){
if (!this.check(options)) return this;
this.options.isSuccess = this.options.isSuccess || this.isSuccess;
this.running = true;
var type = typeOf(options);
if (type == 'string' || type == 'element') options = {data: options};
var old = this.options;
options = Object.append({data: old.data, url: old.url, method: old.method, form: old.form, sendAsBinary: old.sendAsBinary}, options);
var data = options.data, url = String(options.url);
if (!url) url = document.location.pathname;
var trimPosition = url.lastIndexOf('/');
if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
if (this.options.noCache)
url += (url.contains('?') ? '&' : '?') + String.uniqueID();
var xhr = this.xhr;
xhr.open("POST", url, this.options.async, this.options.user, this.options.password);
if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
xhr.onreadystatechange = this.onStateChange.bind(this);
Object.each(this.headers, function(value, key){
try {
xhr.setRequestHeader(key, value);
} catch (e){
this.fireEvent('exception', [key, value]);
}
}, this);
this.fireEvent('request');
if(options.form){
data = new FormData();
options.form.getChildren('input').each(function(el){
var name = el.get('name'),
value = (el.get('type') == 'file')? el.files[0] : el.get('value');
data.append(name, value);
});
}
xhr.send(data);
if (!this.options.async) this.onStateChange();
if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
return this;
}
});
addEvent('domready', function(){
var preview = $('preview'),
output = $('output'),
info = $('info'),
previewWrapper = $('previewWrapper'),
responseWrapper = $('responseWrapper'),
previewBtn = $('previewBtn'),
imageToUpload = $('imageToUpload'),
wrapper = $('wrapper'),
uploadBtn = $('uploadBtn'),
bothBtns = new Elements([uploadBtn, previewBtn]),
isFileReader = true,
fileTypes = {
'jpeg' : true,
'png' : true,
'bmp' : true,
'jpg': true
},
fileToUpload = null,
maxSize = 2986000,
initReader = function(){
if(!isFileReader)
return false;
var reader = new FileReader();
//Chrome doesn't initiatize this - so onload only occurs when the object is created.
reader.onload = function () {
preview.set('src', reader.result);
preview.setStyle('display', 'inline');
};
return reader;
},
testFile = function(fileToUpload){
if(!(fileTypes[fileToUpload.type.replace('image/', '')])){
alert('Please select a valid image.');
return false;
}
if(fileToUpload.size > maxSize){
alert('Filesize limit of ' + maxSize + ' exceeded.');
return false;
}
return true;
},
getPreview = function(e){
bothBtns.set('disabled', 'disabled');
preview.set('src', '/assets/img/pixel.gif');
fileToUpload = $('imageToUpload').files[0];
if(!fileToUpload)
return true;
info.set('html', '<ul><li><strong>'+ fileToUpload.name + '</strong> (' + (fileToUpload.type || 'N/A') + ') ' + fileToUpload.size + ' bytes</li></ul>');
if(testFile(fileToUpload)){
bothBtns.removeProperty('disabled');
var reader = initReader();
if(!reader)
return true;
reader.readAsDataURL(fileToUpload);
if(e && e.type != 'submit'){
var scroll = previewWrapper.getPosition().y;
scrollFx.start(0, scroll);
}
return true;
}
return false;
},
scrollFx = new Fx.Scroll(window, {wheelStops: false}),
myRequest = new Request({
url: 'processFile.php',
headers: {
'Sender' : 'XMLHttpRequest'
},
onRequest: function(){
output.set('html', "<p>Loading...</p>");
var scroll = responseWrapper.getPosition().y;
scrollFx.start(0, scroll);
},
onSuccess: function(text){
var scroll = responseWrapper.getPosition().y;
scrollFx.start(0, scroll);
output.set('html', text);
}
});
if(typeof(window.FormData) === 'undefined'){
$$('#ajaxFileForm, hr, #responseWrapper').dispose();
wrapper.set('html', '<p>Your browser does not support FormData - For XHR File Uploads</p>');
return;
}
if(typeof(window.FileReader) === 'undefined'){
isFileReader = false;
previewBtn.dispose();
previewWrapper.set('html', '<p>Your browser does not support File API - For Previews</p>');
}
$('ajaxFileForm').addEvent('submit', function(e){
e.stop();
if(!getPreview(e))
return false;
responseWrapper.setStyle('display', 'block');
var formData = $('ajaxFileForm');
myRequest.sendFile({form: formData});
});
imageToUpload.addEvent('change', getPreview);
previewBtn.addEvent('click', getPreview);
getPreview();
});
//]]>