2013-10-31 35 views
0

好的,我在这一个白色的结尾。我正尝试使用Javascript调整客户端上传的图片大小。如何在客户端上调整图片大小,但不工作

我使用,

<script>      
function uploadFiles() { 
    if (window.File && window.FileReader && window.FileList && window.Blob) { 
     if (!document.getElementById('confirm').checked) { 
      alert('You must click "confirm".'); 
      return false; 
     } 
     alert('begin'); 
     var files = document.getElementById('file').files; 
     for(var i = 0; i < files.length; i++) { 
      alert('start'); 
      resizeAndUpload(files[i]); 
     } 
     return false; 
    } else { 
     alert('The File APIs are not fully supported in this browser.'); 
     return false; 
    } 
} 

function resizeAndUpload(file) { 
    var reader = new FileReader(); 
    reader.onloadend = function() { 

    var tempImg = new Image(); 
    tempImg.src = reader.result; 
    tempImg.onload = function() { 

     var MAX_WIDTH = 300; 
     var MAX_HEIGHT = 300; 
     var tempW = tempImg.width; 
     var tempH = tempImg.height; 
     if (tempW > tempH) { 
      if (tempW > MAX_WIDTH) { 
       tempH *= MAX_WIDTH/tempW; 
       tempW = MAX_WIDTH; 
      } 
     } else { 
      if (tempH > MAX_HEIGHT) { 
       tempW *= MAX_HEIGHT/tempH; 
       tempH = MAX_HEIGHT; 
      } 
     } 

     var canvas = document.createElement('canvas'); 
     canvas.width = tempW; 
     canvas.height = tempH; 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(this, 0, 0, tempW, tempH); 

     var fd = new FormData(); 
     fd.append("upload-avatar", "Upload"); 
     var confirm = 'off'; 
     if (document.getElementById('confirm').checked) { 
      confirm = 'on'; 
     } 
     fd.append("confirm", confirm); 
     fd.append("file", canvas.mozGetAsFile("image.jpg")); 
     fd.append("license", document.getElementById('license').value); 
     fd.append("name", document.getElementById('name').value); 
     var share = 'off'; 
     if (document.getElementById('share').checked) { 
      share = 'on'; 
     } 
     fd.append("share", share); 
     var xhr = new XMLHttpRequest(); 
     xhr.open("POST", "MyUploadServlet"); 
     xhr.send(fd); 
     alert('done'); 
     } 

    } 
    reader.readAsDataURL(file); 
} 
</script> 

然后在我的HTML我有,

<form onsubmit="return uploadFiles()" method="post" enctype="multipart/form-data"> 
    <input id="file" type="file" name="file" multiple/><br/> 
    <input id="confirm" type="checkbox" name="confirm">confirm</input><br/> 
    ... 
    <input name="upload-resize" value="Upload and resize" type="submit"/><br/> 
</form> 

这实际工作,排序的,但网页不刷新,这是我想做的事情显示上传的图像。如果我从我认为会导致重新加载的函数返回true,那么它不起作用,它似乎永远不会调用该帖子并挂起。 我也试过location.reload()但类似的问题。

好吧,我想我有这个代码的一些问题:

1 - 如何重新加载页面?

- >答案似乎可以称之为 “history.go(0);”,这似乎工作,

2 - 火狐,Chrome浏览器不,IE或Safari 这仅适用于我假设,因为的使用“canvas.mozGetAsFile(”image.jpg“)”, 任何想法如何让它在Chrome上工作?

- >使用toBlob似乎工作,但似乎与页面重载突破,在Firefox而不是其他作品(不,我还没有尝试过填充工具)

3 - 理想我想有两个按钮,一个做调整大小,一个做正常形式提交,不知道该怎么做。目前我有两个完整的表单副本,一个用于调整大小,另一个用于正常文件提交。

4 - 图像以PNG格式上传,如何压缩为JPEG或压缩,即使调整大小,一些图像显示比他们更大的松散压缩。

- >使用toBlob似乎给您JPG,但似乎与页面重载突破,在Firefox而不是其他作品(不,我还没有尝试过填充工具)

对不起,多部分的问题,但我认为任何人想要这样做都需要所有的答案。

+0

我不能完全明白你的观点。但也许你正在寻求我早些时候尝试的。我用JavaScript调整客户端图片的大小,然后将其上传到服务器。如果你正在寻找相似的东西,请告诉我。我有代码,发现一些奇怪的东西。 –

+0

我的问题是如何在调用帖子后重新加载页面,就像正常的提交帖子会做? – James

+0

window.location.href = window.location.href;试试这可能会得到重点。 –

回答

1

Q2 使用canvas.toBlob代替canvas.mozGetAsFile。 There is a polyfill to increase browser compatibility.

在他们的页面上使用的显示

var canvas = document.createElement('canvas'); 
canvas.toBlob(
    function (blob) { 
     // the blob is the jpeg file 
     var formData = new FormData(); 
     formData.append('file', blob, fileName); 
     /* ... */ 
    }, 
    'image/jpeg' 
); 

Q4 指定canvas.toBlob(callback, 'image/jpeg', quality)其中质量是从0.0到1.0(最高质量)

Q3 你可以在多个按钮形成。

<form> 
    <input id="file" type="file" name="file" multiple/><br/> 
    <input id="confirm" type="checkbox" name="confirm">confirm</input><br/> 
    ... 
    <input name="upload" value="Upload" type="button"/> 
    <input name="upload-resize" value="Upload and resize" type="button"/> 
</form> 

请注意,表单标记不包含onsubmit属性,而输入类型现在是按钮而不是提交。

<input name="upload" value="Upload" type="button" onclick="myfunction()"/> 

或代替onclick属性,你可以使用的addEventListener等

Q1 你shoudn't回去的历史。您的location.reload()是正确的,但必须在发送/上传完成后完成。

xhr.onreadystatechange = function() { 
if (xhr.readyState != 4) { return; } 
    location.reload(); 
} 

XMLHttpRequest是异步的,所以发送方法在上传完成之前就会返回!要知道发送是否完成,请使用onreadystatechange,如上所示。

注意:您可能也想检查响应状态码。

+0

谢谢,toBlob在Firefox上工作,但不是铬等。我想我需要查看polyfill,但它打破了页面重新加载,如果我呼叫历史(0),然后它失败,我的猜测是重新加载发生之前发生 – James

+0

添加了一个答案Q1,它不使用历史 – LostInComputer

+0

谢谢你的工作 – James

相关问题