>  기사  >  웹 프론트엔드  >  Ajax HTML에서 파일 업로드를 구현하는 기술 요약

Ajax HTML에서 파일 업로드를 구현하는 기술 요약

韦小宝
韦小宝원래의
2017-12-30 20:14:291727검색

이 글은 ajaxhtml을 기반으로 한 파일 업로드 기술을 주로 요약한 것입니다. ajax 학습을 위한 특정 참조 가치가 있습니다. ajax에 관심이 있는 친구들은 참고할 수 있습니다.

인용문: 모두가 알고 있듯이 , HTML로 파일을 업로드하려면 type=file이라는 하나의 입력만 필요합니다. 하지만 이 라벨의 스타일은 사실 언급할 가치가 없습니다. 스타일을 바꾸는 것은 아마도 어려울 것입니다. 하지만 오늘은 파일 업로드에 대한 몇 가지 팁에 대해 이야기해 보겠습니다.

1. 스타일을 맞춤설정하는 방법은 무엇인가요?
1) abc3a7c0b41fd564e3345b8481f574fb5db79b134e9f6b82c0b36e0489ee08ed과 같이 보고 싶은 스타일에 따라 정의하면 배경 이미지 효과가 될 수 있습니다. , 텍스트 지침이 될 수 있습니다. 간단히 말해서 원하는 대로 변경할 수 있습니다! 버튼을 사용하면 업로드할 파일을 선택할 때 이름을 저장하는 파일 이름 컨테이너도 필요하므로 업로드가 지루하고 이해하기 어려워지는 것을 방지할 수 있습니다.

2) 실제로 업로드해야 하는 파일 컨트롤을 추가하고 4d2ffc44994b3a0ff1e24e31262c1a07와 같은 display:none 속성을 설정하여 실제 업로드할 위치가 있도록 합니다. 파일을 업로드합니다. 따라서 파일 업로드 인터페이스가 얼마나 아름다운지는 여러분의 상상력에 달려 있다고 할 수 있습니다!

2. 이벤트를 트리거하는 방법은 무엇입니까?

트리거 포인트는 작성한 스타일이어야 하지만 실제로 작동하는 요소는 숨겨져 있지만 클릭 효과에는 영향을 미치지 않습니다. $('#target-file').trigger('click');

3. 여러 파일을 선택하시겠습니까?

여러 파일을 업로드하려면 HTML에서 파일의 multiple=true를 사용하면 됩니다. 물론 swfupload와 같은 타사 업로드 컨트롤을 선택할 수도 있지만 그렇지 않은 사람들에게는 좋습니다. 플러그인을 사용하고 싶지 않으면 작동하지 않습니다. 부터

인터페이스 미화는 실제로 jqueryui와 같은 플러그인을 사용할 수 있습니다. 친숙한 상호 작용을 원한다면 새로 고침 없는 전환, 비동기 업로드 및 제출과 같은 Ajax 기술이 사용됩니다. pushState를 사용하여 ajax 경로를 유지할 수도 있습니다. replacementState는 pjax를 구현합니다.
양식 유효성 검사: validform.js

비동기 파일 제출: jquery.form.js

친숙한 팝업 프롬프트: layer.js



5. 문제?

인터페이스 작업을 할 때 가장 두렵고 중요한 것은 다양한 브라우저 간의 호환성 문제입니다. 참고할 주요 사항은 다음과 같습니다.

테이블 너비가 일관되지 않게 처리됩니다.

select, 입력 디스플레이 높이가 일관되지 않습니다.

경고 팝업 창이 일치하지 않습니다.

...


6. 데모 코드


<a href="javascript:;" up-type-id="1" class="btn btn-default small-btn switch-upload-method"><span>本地上传</span></a>
<a href="javascript:;" up-type-id="2" class="upload-file-instead btn btn-default small-btn switch-upload-method"><span>打包工具</span></a>
<input type="file" name="apkFiles[]" id="local-upload-real-file" class="upload-file-real hide" response-id="local-upload-container" multiple=&#39;true&#39; />
<input type="file" name="apkToolFiles[]" id="apk-tool-real-file" class="upload-file-real hide" response-id="apk-tool-container-textarea" />
<script>
 $(function(){
  var alertTitle = &#39;系统提示:&#39;;
  var submitId = &#39;#do-submit&#39;;
  $(&#39;#taskForm&#39;).Validform({
   btnSubmit: submitId,
   tiptype: 1,
   ignoreHidden: true,
   dragonfly: false,
   tipSweep: true,
   label: ".label",
   showAllError: false,
   postonce: true,
   ajaxPost: true,
   datatype:{
   },
   beforeCheck:function(curform){
   },
   beforeSubmit:function(curform){
    $(&#39;.upload-file-real&#39;).attr(&#39;disabled&#39;, &#39;disabled&#39;);
    $(submitId).attr(&#39;disabled&#39;, &#39;disabled&#39;); //提交前禁用按钮
    ajaxSubmitForm(curform);
    $(submitId).removeAttr(&#39;disabled&#39;);   //失败后恢复可提交
    return false;
   },
   submitForm: function(){}      //不再起作用
  });

  //切换上传方法
  $(&#39;.switch-upload-method&#39;).off().on(&#39;click&#39;, function(){
//   $(submitId).attr(&#39;disabled&#39;, &#39;disabled&#39;);
   var pObj = $(this).parent().find(&#39;.switch-upload-method&#39;);
   var index = pObj.index(this);
   var uploadTypeId = $(&#39;#upload-type-id&#39;).val();      //上传方式:1:打包工具;2:本地上传,0:没有上传方式
   var uploadType = $(this).attr(&#39;up-type-id&#39;);
   if(parseInt($(&#39;#sub-channel-count&#39;).html()) > 0){
    if(uploadTypeId != uploadType){
     layer.alert(&#39;还有子渠道包数据,不能完成切换,请先确认清除再切换!&#39;);
     return false;
    }
   }
   pObj.not(&#39;:eq(&#39; + index + &#39;)&#39;).removeClass(&#39;btn-danger&#39;).addClass(&#39;btn-default&#39;);
   pObj.eq(index).removeClass(&#39;btn-default&#39;).addClass(&#39;btn-danger&#39;);
   if(uploadType == 36){    //local-upload
    $(&#39;#upload-type-id&#39;).val(uploadType);
    $(&#39;#init-apk-container&#39;).show();
    $(&#39;#apk-tool-container&#39;).hide();
    $(&#39;#upload-main-control&#39;).find(&#39;.del-it-main&#39;).css({display: &#39;inline-block&#39;});
    $(&#39;#local-upload-real-file&#39;).trigger(&#39;click&#39;);
   }else if(uploadType == 35){   //apk-tool
    $(&#39;#upload-type-id&#39;).val(uploadType);
    $(&#39;#init-apk-container&#39;).hide();
    $(&#39;#local-upload-container&#39;).hide();
    $(&#39;#upload-main-control&#39;).find(&#39;.del-it-main&#39;).hide();
    $(&#39;#apk-tool-container&#39;).show();
   }
  });
  //本地上传
  $(&#39;#local-upload-real-file&#39;).off().on(&#39;change&#39;, function(){
   if(!$(this).val()){
    return false;
   }
   file_size = 0;
   filepath = $(this).val();
   maxFileSize = 30 * 1024 * 1024;
   var browserCfg = {};
   var ua = window.navigator.userAgent;
   if (ua.indexOf("MSIE") >=1 ){
    browserCfg.ie = true;
   }else if(ua.indexOf("Firefox") >=1 ){
    browserCfg.firefox = true;
   }else if(ua.indexOf("Chrome") >=1 ){
    browserCfg.chrome = true;
   }
   if (browserCfg.ie) {
    var img = new Image();
    img.src = filepath;
    file_size = img.fileSize;
    while (true) {
     if (img.fileSize > 0) {
      if (img.fileSize > maxFileSize) {
       alert("上传包超过30MB限制,请使用打包工具上传!");
       return false;
      }
      break;
     }
    }
   } else {
    file_size = this.files[0].size;
    if (file_size > maxFileSize) {
     alert("上传包超过30MB限制,请使用打包工具上传!");
     return false;
    }
   }

   var responseObjId = $(this).attr(&#39;response-id&#39;);
   var responseObj = $(&#39;#&#39; + responseObjId);
   $(&#39;#taskForm&#39;).ajaxSubmit({
    url:&#39;/aa/bb/uploadTmpApk&#39;,
    resetForm: false,
    dataType: &#39;json&#39;,
    beforeSubmit: function(option){
     window.loading = layer.load(2);
    },
    success: function(data, statusText){
     layer.close(window.loading);
     if(data.status == 1){
      $(&#39;#version-identifier&#39;).val(data.version);
      responseObj.html(data.apkInfoHtml);
      responseObj.show();
      var delObj = $(&#39;#upload-main-control&#39;).find(&#39;.del-it-main&#39;);
      delObj.css({&#39;display&#39;: &#39;inline-block&#39;});
      $(&#39;#sub-channel-count&#39;).html(data.apkTotal);
      $(&#39;#init-apk-container&#39;).hide();
      $(submitId).removeAttr(&#39;disabled&#39;);
     }else{
      layer.alert(data.info, {title: alertTitle});
     }
    },
    error: function(data){
     layer.close(window.loading);
     layer.alert(&#39;未知错误,请稍后再试!&#39;);
    }
   });
   return false;//防止dialog 自动关闭
  });
  //打包工具
  $(&#39;#apk-tool-real-file&#39;).off().on(&#39;change&#39;, function(){
   if(!$(this).val()){
    return false;
   }
   var responseObjId = $(this).attr(&#39;response-id&#39;);
   var responseObj = $(&#39;#&#39; + responseObjId);
   $(&#39;#Form&#39;).ajaxSubmit({
    url:&#39;/aa/bb/uploadTmpApkTool&#39;,
    resetForm: false,
    dataType: &#39;json&#39;,
    beforeSubmit: function(option){
     window.loading = layer.load(2);
    },
    success: function(data, statusText){
     layer.close(window.loading);
     if(data.status == 1){
      $(&#39;#version-identifier&#39;).val(data.version);
      responseObj.html(data.infoHtml);
      var parentContainer = responseObj.parent().parent(),
       nameContainer = parentContainer.find(&#39;.apk-name-container&#39;),
        delObj = parentContainer.find(&#39;.del-it-apk-tool&#39;);
      nameContainer.html(data.apkName);
      nameContainer.attr(&#39;title&#39;, data.apkName);
      $(&#39;#apk-tool-file-tmp&#39;).html(data.fileInfo);
      $(submitId).removeAttr(&#39;disabled&#39;);
     }else{
      layer.alert(data.info, {title: alertTitle});
     }
    },
    error: function(data){
     layer.close(window.loading);
     layer.alert(&#39;未知错误,请稍后再试!&#39;);
    }
   });
   return false;//防止dialog 自动关闭
  });
  $(&#39;.apk-tool-upload-button&#39;).on(&#39;click&#39;, function(){
   $(&#39;#apk-tool-real-file&#39;).trigger(&#39;click&#39;);
  });
 });
</script>



입력 파일 태그 선택, 파일 선택 후 즉시 Ajax 제출, 마지막으로 전체 양식 Ajax 제출 과정을 거치게 됩니다. CSS와 JS를 합리적으로 사용하여 웹페이지를 더욱 자유롭게 만드세요!


관련 권장사항:

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

PHP와 유사한 AJAx 업로드 이미지의 간단한 예

Ajax 업로드 매개변수 제출이 업데이트되지 않음 및 기타 관련 문제

위 내용은 Ajax HTML에서 파일 업로드를 구현하는 기술 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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