1. 이미지 업로드에 대하여
XHTML 시대에는 HTML 파일 컨트롤을 사용하여 한 번에 하나의 이미지만 업로드할 수 있습니다. 여러 장의 이미지를 한꺼번에 업로드하려면 플래시를 사용하는 방법이 있습니다. 예를 들어 swfupload.js입니다. 안타깝게도 플래시 파일이 페이지와 동일한 상위 폴더에 있어야 하고 JavaScript 파일 크기도 상당하다는 등 사용 시 몇 가지 복잡한 문제가 있습니다.
이전에 "Ajax 업로드 다중 파일 업로드 플러그인"에 대한 기사를 번역하고 편집한 적이 있습니다. 그러나 이 플러그인의 하이라이트는 숨겨진 iframe 프레임 페이지를 사용하여 Ajax 업로드를 시뮬레이션한다는 것입니다. , 실제로 한 번에 업로드할 수 있는 사진은 여러 번 업로드할 수 있습니다.
HTML5의 좋은 점 중 하나는 다중 이미지 업로드 지원, Ajax 업로드 지원, 업로드 전 이미지 미리보기 지원, 이미지 드래그 앤 드롭 지원 등 순수하게 파일을 사용하여 구현된다는 것입니다. 아주 적은 JS 코드로 제어할 수 있다는 점은 칭찬받지 않을 수 없습니다!
2. 데모 페이지
사용 중인 브라우저가 최신 FireFox 또는 Chrome 브라우저인 경우 여기를 클릭하세요. HTML5 다중 이미지 Ajax 업로드 데모 기반
데모 페이지에서 파일 컨트롤을 클릭하여 다음과 같이 여러 이미지를 업로드할 수 있습니다(FireFox 6 스크린샷, 아래와 동일).
이미지가 아닌 파일이 있거나 이미지 크기가 너무 큰 경우 다음 메시지가 나타납니다.
또는 바탕화면에 이미지를 직접 드래그할 수도 있습니다. 드래그 영역 허용:
해제 후 이미지를 직접 미리 볼 수 있습니다(현재 서버에 업로드되지 않았습니다):
이때 사진을 미리 삭제할 수도 있고, 직접 업로드할 수도 있습니다. 예를 들어 업로드 버튼을 누르면 곧 사진이 성공적으로 업로드됩니다. :)!
업로드 후 페이지 주소는 다음과 같이 반환됩니다.
이때, 해당 페이지 주소는 upload 폴더 아래에 이 사진이 있습니다:
참고: 제 블로그 공간이 제한되어 있어서 사진 폴더를 정기적으로 정리할 예정이니 제발 하지 마세요. 삭제하지 마세요 무료이미지 호스팅입니다~~
3. 코어 스켈레톤 스크립트에 대한 간단한 분석
첫번째는 천천히 삼켜버린 코어 파일입니다. 이틀 전 완료되었습니다. 파일 이름은 다음과 같습니다. zxxFile.js(다운로드하려면 마우스 오른쪽 버튼을 클릭하세요.)
이 파일은 크기가 몇 킬로바이트에 불과하고 수백 줄의 코드로 구성되어 있습니다. 파일 업로드(선택, 삭제 등), 네이티브 JS, so , jQuery, YUI, MooYools 등과 호환됩니다. zxxFile.js는 실제로 작은 뼈대 파일이므로 본문을 별도로 추가해야 합니다.
zxxFile.js는 실제로 작은 객체입니다.
var ZXXFILE = { //骨架们... }
다음 표는 ZXXFILE 객체의 속성(스켈레톤)과 해당 객체를 보여줍니다. 해당 내용과 의미 등
추가 설명: 위에서 여러 번 언급한 파일 매개변수는 파일 개체 개체를 참조합니다. 이 개체의 속성 값에는 이름, 크기, 유형 등이 포함됩니다. . 그런 다음 .js의 zxxFile에는 요소 위치 지정을 용이하게 하는 index 속성도 있습니다.
显然,只有骨架基本上做不了什么事件。demo页面之所以有效果,就是其按照上面的骨架,根据实际的需求增加了血肉。您可以直接“右键-查看页面源代码”一览所有相关JavaScript。或者看我下面一点一点婆妈的讲述。
我们按照上面表格中的骨架进行示意。demo页面借用了比较流行的jQuery库,骨架+血肉 = 插件,当然,demo页面并不是奔着插件去的(虽然只需稍加修改),因为页面的UI显然不够插件的份。也就是说,利用zxxFile.js骨架,配合点你自己属性的JavaScript库就可以书写属于你自己的基于HTML5的多文件Ajax上传插件啦!
四、demo页面的些代码
demo页面代码整体逻辑如下:
var params = { //血肉们 }; ZXXFILE = $.extend(ZXXFILE, params); ZXXFILE.init();
fileInput
首先是file控件元素,如下:
fileInput: $("#fileImage").get(0)
因为是DOM元素,所以应用了jQuery的get方法。下面两个参数同。
demo页面中的file控件元素支持多文件选择,其隐藏的玄机就是下面代码中大红高亮的部分:
dragDrop和upButton
拖拽区域和上传按钮(默认隐藏):
dragDrop: $("#fileDragArea").get(0), upButton: $("#fileSubmit").get(0)
url
Ajax上传地址,没什么好说的,取的是表单的action地址:
url: $("#uploadForm").attr("action")
filter方法
对选择的文件进行过滤。file控件什么文件都能选,而demo页面是图片上传相关的demo;空间大小有限,超大尺寸的图片还是挡着为好。显然,要对上传文件进行过滤。于是,就有了如下的过滤脚本:
filter: function(files) { var arrFiles = []; for (var i = 0, file; file = files[i]; i++) { if (file.type.indexOf("image") == 0) { if (file.size >= 512000) { alert('您这张"'+ file.name +'"图片大小过大,应小于500k'); } else { arrFiles.push(file); } } else { alert('文件"' + file.name + '"不是图片。'); } } return arrFiles; }
zxxFile.js会自动对过滤后的文件对象列表进行整合,以准确上传。
onSelect方法
文件(这里就是图片)选择后执行的方法。在本实例页面中,onSelect方法的主要任务就是本地图片在浏览器中的预览。本地图片上传之前在浏览器中预览的核心脚本就是:
var reader = new FileReader(), htmlImage; reader.onload = function(e) { htmlImage = '<img src="'+ e.target.result +'" / alt="HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드" >'; } reader.readAsDataURL(file);
在本demo页面中,该部分完成脚本如下,虽好像有些长度,其实内容就是装载一些HTML代码而已:
onSelect: function(files) { var html = '', i = 0; //等待载入gif动画 $("#preview").html('<p class="upload_loading"></p>'); var funAppendImage = function() { file = files[i]; if (file) { var reader = new FileReader() reader.onload = function(e) { html = html + '<p id="uploadList_'+ i +'" class="upload_append_list"><p><strong>' + file.name + '</strong>'+ '<a href="javascript:" class="upload_delete" title="删除" data-index="'+ i +'">删除</a><br />' + '<img id="uploadImage_' + i + '" src="' + e.target.result + '" class="upload_image" / alt="HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드" ></p>'+ '<span id="uploadProgress_' + i + '" class="upload_progress"></span>' + '</p>'; i++; funAppendImage(); } reader.readAsDataURL(file); } else { //图片相关HTML片段载入 $("#preview").html(html); if (html) { //删除方法 $(".upload_delete").click(function() { ZXXFILE.funDeleteFile(files[parseInt($(this).attr("data-index"))]); return false; }); //提交按钮显示 $("#fileSubmit").show(); } else { //提交按钮隐藏 $("#fileSubmit").hide(); } } }; //执行图片HTML片段的载人 funAppendImage(); }
细心的你可能发现到上面的HTML元素中基本上都用到了i这个索引,作用是方便后面删除可以找到相应的元素。
然后,还有一个需要注意的就是删除事件——执行了ZXXFILE.funDeleteFile()方法,这是必须的,真正将图片从文件列表中删除,同时用来触发onDelete方法的回调。
onDelete方法
图片上传完毕或是删除之时执行飞方法。本实例是让其渐隐:
onDelete: function(file) { $("#uploadList_" + file.index).fadeOut(); }
onDragOver方法
文件拖到拖拽元素上时执行的方法,本实例就是增加了个类名,如下:
onDragOver: function() { $(this).addClass("upload_drag_hover"); }
onDragLeave方法
文件移出元素上时执行的方法,本实例就是去掉了个类名,如下:
onDragLeave: function() { $(this).addClass("upload_drag_hover"); }
onProgress方法
上传中触发的方法。本demo效果就是图片左上角有个有着圆角黑色半透明背景元素,里面的百分比值不断增加。代码:
onProgress: function(file, loaded, total) { var eleProgress = $("#uploadProgress_" + file.index), percent = (loaded / total * 100).toFixed(2) + '%'; eleProgress.show().html(percent); }
onSuccess方法
当前图片上传成功后执行的方法。本demo就是提示返回的图片地址信息:
onSuccess: function(file, response) { $("#uploadInf").append(""<p>上传成功,图片地址是:" + response + ""</p>"); }
onFailure方法
图片上传嗝屁时尿出的方法。本demo为提示,然后图片浅透明:
onFailure: function(file) { $("#uploadInf").append("<p>图片" + file.name + "上传失败!</p>"); $("#uploadImage_" + file.index).css("opacity", 0.2); }
onComplete方法
当所有图片都上传完毕之后,本实例页面把file控件的value值置空,同时按钮隐藏了:
onComplete: function() { //提交按钮隐藏 $("#fileSubmit").hide(); //file控件value置空 $("#fileImage").val(""); $("#uploadInf").append("<p>当前图片全部上传完毕,可继续添加上传。</p>"); }
PHP页面相关代码
$fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false); if ($fn) { file_put_contents( 'uploads/' . $fn, file_get_contents('php://input') ); echo "http://www.zhangxinxu.com/study/201109/uploads/$fn"; exit(); }
以上就是主要的些功能或交互代码。至于CSS样式部分以及HTML代码中的一些细节我就懒得捡芝麻了。您有兴趣可以通过查看源代码观摩观摩。
5. 현재 HTML5 파일 Ajax 업로드 적용 범위
IE에서는 지원하지 않을 뿐만 아니라 win의 최신 Safari 브라우저나 Opera에서는 HTML5의 다중 이미지 미리보기를 완벽하게 지원하지 않습니다. Ajax 업로드, 그러면 이걸 왜 배워야 할까요? 적어도 지금은 이런 새가 없습니다.
실제로 일부 외부 프로젝트에서 대다수 사용자가 사용하는 웹 페이지에 이 기술을 사용하는 것은 아직 이르다. 하지만 회사의 인트라넷 프로젝트라면 이것을 적용해도 전혀 문제가 없습니다. 나는 매우 이상한 문제를 발견했습니다. 인트라넷 웹 페이지는 낮은 버전의 IE를 지원하지만 최신 브라우저를 지원하지 않습니다. 이것은 완전히 잘못된 길을 가고 있습니다.
최근 저희 회사에서는 인트라넷 프로젝트 개편에 착수하여 크롬 등 최신 브라우저 기반의 인트라넷 개발을 시작하였고(물론 IE 브라우저도 사용 가능) 내부 직원들은 크롬을 강제로 사용하고 있습니다. 브라우저. 우리 회사의 경우 UI 효과, 상호 작용, 속도 경험 등 반응이 매우 좋습니다.
분명히 적어도 우리 회사에서는 향후 인트라넷 편집자나 비서에게 다중 이미지 업로드 기능을 제공하고 싶다면 HTML5 파일 업로드를 직접 사용할 수 있다는 것이 이 글의 내용이다. 단순함, 속도, 속도는 개발이 행복하고 가치 있는 일이라는 것을 깨닫게 해줄 것입니다.
또한 이 기사의 데모 페이지에는 실수가 있는 경우 사과드립니다. zxxFile.js는 방금 출시되었으며 아직 실행되지 않았습니다. 여러분의 소중한 의견을 환영합니다. 정말 감사합니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.
HTML5 기반 미리보기 가능한 다중 이미지 Ajax 업로드와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!