>  기사  >  웹 프론트엔드  >  HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

高洛峰
高洛峰원래의
2017-02-17 17:08:172202검색

1. 이미지 업로드에 대하여

XHTML 시대에는 HTML 파일 컨트롤을 사용하여 한 번에 하나의 이미지만 업로드할 수 있습니다. 여러 장의 이미지를 한꺼번에 업로드하려면 플래시를 사용하는 방법이 있습니다. 예를 들어 swfupload.js입니다. 안타깝게도 플래시 파일이 페이지와 동일한 상위 폴더에 있어야 하고 JavaScript 파일 크기도 상당하다는 등 사용 시 몇 가지 복잡한 문제가 있습니다.

이전에 "Ajax 업로드 다중 파일 업로드 플러그인"에 대한 기사를 번역하고 편집한 적이 있습니다. 그러나 이 플러그인의 하이라이트는 숨겨진 iframe 프레임 페이지를 사용하여 Ajax 업로드를 시뮬레이션한다는 것입니다. , 실제로 한 번에 업로드할 수 있는 사진은 여러 번 업로드할 수 있습니다.

HTML5의 좋은 점 중 하나는 다중 이미지 업로드 지원, Ajax 업로드 지원, 업로드 전 이미지 미리보기 지원, 이미지 드래그 앤 드롭 지원 등 순수하게 파일을 사용하여 구현된다는 것입니다. 아주 적은 JS 코드로 제어할 수 있다는 점은 칭찬받지 않을 수 없습니다!

2. 데모 페이지

사용 중인 브라우저가 최신 FireFox 또는 Chrome 브라우저인 경우 여기를 클릭하세요. HTML5 다중 이미지 Ajax 업로드 데모 기반

데모 페이지에서 파일 컨트롤을 클릭하여 다음과 같이 여러 이미지를 업로드할 수 있습니다(FireFox 6 스크린샷, 아래와 동일).

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

이미지가 아닌 파일이 있거나 이미지 크기가 너무 큰 경우 다음 메시지가 나타납니다.

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

또는 바탕화면에 이미지를 직접 드래그할 수도 있습니다. 드래그 영역 허용:

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

해제 후 이미지를 직접 미리 볼 수 있습니다(현재 서버에 업로드되지 않았습니다):

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

이때 사진을 미리 삭제할 수도 있고, 직접 업로드할 수도 있습니다. 예를 들어 업로드 버튼을 누르면 곧 사진이 성공적으로 업로드됩니다. :)!

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

업로드 후 페이지 주소는 다음과 같이 반환됩니다.

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

이때, 해당 페이지 주소는 upload 폴더 아래에 이 사진이 있습니다:

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

참고: 제 블로그 공간이 제한되어 있어서 사진 폴더를 정기적으로 정리할 예정이니 제발 하지 마세요. 삭제하지 마세요 무료이미지 호스팅입니다~~

3. 코어 스켈레톤 스크립트에 대한 간단한 분석
첫번째는 천천히 삼켜버린 코어 파일입니다. 이틀 전 완료되었습니다. 파일 이름은 다음과 같습니다. zxxFile.js(다운로드하려면 마우스 오른쪽 버튼을 클릭하세요.)

이 파일은 크기가 몇 킬로바이트에 불과하고 수백 줄의 코드로 구성되어 있습니다. 파일 업로드(선택, 삭제 등), 네이티브 JS, so , jQuery, YUI, MooYools 등과 호환됩니다. zxxFile.js는 실제로 작은 뼈대 파일이므로 본문을 별도로 추가해야 합니다.

zxxFile.js는 실제로 작은 객체입니다.

var ZXXFILE = {
  //骨架们...
}

다음 표는 ZXXFILE 객체의 속성(스켈레톤)과 해당 객체를 보여줍니다. 해당 내용과 의미 등

HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드

추가 설명: 위에서 여러 번 언급한 파일 매개변수는 파일 개체 개체를 참조합니다. 이 개체의 속성 값에는 이름, 크기, 유형 등이 포함됩니다. . 그런 다음 .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 = &#39;<img  src="&#39;+ e.target.result +&#39;" / alt="HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드" >&#39;;
}
reader.readAsDataURL(file);

在本demo页面中,该部分完成脚本如下,虽好像有些长度,其实内容就是装载一些HTML代码而已:

onSelect: function(files) {
  var html = &#39;&#39;, i = 0;
  //等待载入gif动画
  $("#preview").html(&#39;<p class="upload_loading"></p>&#39;);
  var funAppendImage = function() {
    file = files[i];
    if (file) {
      var reader = new FileReader()
      reader.onload = function(e) {
        html = html + &#39;<p id="uploadList_&#39;+ i +&#39;" class="upload_append_list"><p><strong>&#39; + file.name + &#39;</strong>&#39;+ 
          &#39;<a href="javascript:" class="upload_delete" title="删除" data-index="&#39;+ i +&#39;">删除</a><br />&#39; +
          &#39;<img  id="uploadImage_&#39; + i + &#39;" src="&#39; + e.target.result + &#39;" class="upload_image" / alt="HTML5 기반의 미리보기 가능한 다중 이미지 Ajax 업로드" ></p>&#39;+ 
          &#39;<span id="uploadProgress_&#39; + i + &#39;" class="upload_progress"></span>&#39; +
        &#39;</p>&#39;;
        
        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) + &#39;%&#39;;
  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[&#39;HTTP_X_FILENAME&#39;]) ? $_SERVER[&#39;HTTP_X_FILENAME&#39;] : false);
if ($fn) {
  file_put_contents(
    &#39;uploads/&#39; . $fn,
    file_get_contents(&#39;php://input&#39;)
  );
  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 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.