[关闭]
@bornkiller 2014-07-15T02:10:58.000000Z 字数 2490 阅读 2382

浏览器图片预览

javascript

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>Title Page</title>
  5. <meta charset="UTF-8">
  6. <meta name=description content="">
  7. <meta name=viewport content="width=device-width, initial-scale=1">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. </head>
  10. <body>
  11. <div id="loves"></div>
  12. <input type="button" id="upload" value="submit">
  13. <progress max=100 min=0 value=0></progress>
  14. <script>
  15. document.addEventListener('drop', prevent);
  16. document.addEventListener('drop', fileHunter);
  17. document.addEventListener('dragenter', prevent);
  18. document.addEventListener('dragleave', prevent);
  19. document.addEventListener('dragover', prevent);
  20. var tmp = null;
  21. function prevent(e){
  22. e.stopPropagation();
  23. e.preventDefault();
  24. }
  25. function fileHunter(e){
  26. var reader = new FileReader();
  27. var images = e.dataTransfer.files;
  28. tmp = images[0];
  29. reader.readAsDataURL(images[0]);
  30. reader.addEventListener('load',function(e){
  31. var img = document.createElement('img');
  32. img.src = reader.result;
  33. document.querySelector('#loves').appendChild(img);
  34. })
  35. }
  36. function uploadFile(){
  37. var form = new FormData();
  38. form.append(tmp.name,tmp);
  39. var xhr = new XMLHttpRequest();
  40. xhr.open('POST','http://127.0.0.1:1337/upload',true);
  41. var progress = document.querySelector('progress');
  42. xhr.addEventListener('progress',function(e){
  43. if(e.lengthComputable){
  44. progress.value = Math.round((e.loaded/e.total)*100);
  45. }
  46. });
  47. xhr.addEventListener('load',function(e){
  48. console.log(this.response);
  49. })
  50. xhr.send(form);
  51. }
  52. document.querySelector('#upload').addEventListener('click',uploadFile);
  53. </script>
  54. </body>
  55. </html>

这里代码基本完成要求,说明如下:

  • 拖动添加,需要阻止默认行为,否则浏览器会尝试打开文件。如果是拖动事件,通过e.dataTransfer.files获取文件列表,如果通过<input type="file" multiple>需要监听change事件,通过e.target.files获取文件列表。
  • 文件预览 FileReader不知道是不是HTML5标准,但是现代浏览器基本上都支持,而且需要浏览器支持data-url schema,firefox跟chrome提供的快捷方法window.URL.createObjectURL(),window.webkitURL.createObjectURL()返回的是一个blob:***的二进制流,也是可以用的,但不清楚原理。
  • 文件上传进度监控,XHR2提供progress事件用于检测上传状态,两个属性e.total,e.loaded总大小和已上传大小。
  1. function shortcut(e){
  2. var images = e.dataTransfer.files;
  3. var img = document.createElement('img');
  4. img.src = window.webkitURL.createObjectURL(images[0]);
  5. document.querySelector('#loves').appendChild(img);
  6. }

后台使用nodejs Express框架编写

  1. /**
  2. * Created by Administrator on 14-2-5.
  3. */
  4. var express =require('express');
  5. var app = express();
  6. app.post('/upload',
  7. express.bodyParser({ keepExtensions: true, uploadDir: __dirname + '/static/upload' }),
  8. uploadSolve);
  9. app.use(app.router);
  10. app.use(express.static(__dirname + '/static'));
  11. app.listen(1337);
  12. function uploadSolve(req,res,next){
  13. res.status(200);
  14. }

没有任何安全防护的操作,仅基础的文件保存功能。

疑问请联系QQ:491229492

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注