最埌のファむルアップロヌダヌ

画像

私は䞭栞以倖の教育ず10幎以䞊の経隓を持぀Web開発者です。 私は顧客のために、時には䞊叞にしか起こらないりェブのためにすべおをしたした。 この仕事が倧奜きです。 しかし、それでも私はたったく笑わずにやるこずがいく぀かありたす。 それらの1぀はファむルアップロヌダヌです。 最初から-それが誰にも起こらずにajaxになったずき-そしお今たで-それは写真のサむズを倉曎し、いく぀かのストリヌムにファむルをアップロヌドし、はるかに-それは私にずっお最も愛されおいないタスクの1぀のたたです なんずか凊理できたようです。 興味があれば、猫ぞようこそ。

ちょっずしたCoffeescript、jQueryに関するかなりの䞍満、$ .Deferredの簡単な説明、むンプレヌスずアりトオブプレヌスの䞍泚意に適甚されたパタヌン、そしお面癜い面癜い本ぞのリンクがあなたを埅っおいたす。





したがっお、私たちの前のタスクは、ファむルアップロヌダヌをサむトにアップロヌドするこずです。 もちろん、AJAXはもちろん、進行䞭です。もちろん、既に完成したデザむンです。 そもそも-なぜこれが問題なのですか クロスブラりザ。 叀き良きトリックi-frameでのa-la送信フォヌムは進歩をもたらさず、新しいものxhr.sendは叀いブラりザでは機胜したせん。 ブラりザの暙準化が 突然停止し、クロスブラりザの問題が死なないようにずいう垌望がありたした。 远加のタスクは、ドラッグアンドドロップです。 input'aの倖芳にはただ問題がありたす。

どのようなオプションがありたすか

方法No. 1、Google䞻導の開発


Shustrenkoは、必芁なすべおの機胜を実装するかなり人気のあるjQueryラむブラリヌをgoogleしたす。 アプロヌチは時間の䞍足で正しいです。 プロゞェクトに非垞に迅速に統合され、ブラりザずの互換性を心配し、フォヌマットされたDOMも衚瀺したす。 結局のずころ、DOMをスタむルで再加工しおも問題はありたせんjQueryを䜿甚しおも、それが䞻な専門分野ですよね。機胜に぀いお興味のある関係者「はい、そうではありたせん。しかし、偶発的に発生したチップの皮類を芋おください。本圓にすごいですか」。 そしお、すべおがスヌパヌであるように芋え、すべおが玠晎らしいようです。 1日間、それを凊理しおテストに枡すこずはかなり可胜です。 しかし、その埌...最初のツバメはデザむナヌから飛び出したす-いく぀かの歌姫が出たした誰かがダりンロヌドを䞭断したか、別のより゚キゟチックな状況を䜜り出したした しかし、このdivは衚瀺されなかったため、控えめに蚀っおも、そのdivのスタむルはたったく同じではありたせん。 デザむナヌの圓然の非難を消化し、テスタヌの代衚団の到着を芳察したす。 䌁業の暙準により、ナヌザヌのXXパヌセントおよび最も䟡倀のあるナヌザヌが働いおいる玠晎らしいブラりザヌでは、進行状況が衚瀺されたせん。 ホラヌ テスタヌを地獄に送っおください「ブラりザがサポヌトしおいない堎合、どうすればいいですか」。勝利の衚情で、あごのフックをスキップしたす「Vkontakteアップロヌドはこのブラりザで動䜜したす」 そしおその瞬間、プロゞェクトに察しお最悪の犯眪の1぀を犯したす。この玠晎らしいプラグむンの゜ヌスコヌドにアクセスしたす。 オプションずしお、昚幎より前にプラグむントラッカヌでこの゚ラヌに関するメッセヌゞを芋぀け、運が良ければ、この特定の問題をプラグむンする䜕らかの束葉杖を芋぀けおください。 実際、これはプログラマヌほど怖くない。 あなたは誰かのコヌドを読むこずを孊ぶでしょう-時には良い、時には...異なる。 デバッガヌをもう䞀床䜿甚したす。 jQueryのプラグむン開発者に぀いお悪いこずを蚀いたくはありたせん。 私が出䌚ったほずんどの堎合、圌らのコヌドは郚倖者をサポヌトするように蚭蚈されおいないだけです。 しかし、プロゞェクトのタむミングが燃え始める可胜性がありたす。 時間がないため、このオプションを遞択したこずを芚えおいたすか

それでも、ただプラグむンをプラグむンしおいる堎合は、プロゞェクトリポゞトリにプラグむンの瞮小バヌゞョンのみを残しおください。 たた、プラグむンサむトぞのリンクをどこにも残さないでください。

芁玄デザむンず機胜を補うこずができる堎合にのみ、銎染みのないプラグむンを䜿甚したす。 たあ、たたはデザむナヌや他のテスタヌの埩//トレヌニングのために。 たたは、リバヌス゚ンゞニアリングスキルのトレヌニングずしお。



パス番号2、履歎


ハ 半幎前、私たちはすでにそのようなものを曞きたした。 オランダ人ギリシャ人、オヌストラリア人、ペルシャ人... 緑色の楕円圢の進行状況バヌがただありたした。 叀いプロゞェクトを開きたす別のコンピュヌタヌ、燃え尜きたリポゞトリヌ、およびそれほど単玔ではない別の100500の理由。 アップロヌダヌを芋た、煙の皮類。 そしおそこ...最初に-最新のブラりザのみのサポヌト。 次に、クラむアント偎のフラッシュのサむズ倉曎。 第䞉に、この最も蚘憶に残る楕円圢デザむナヌはスカムです進行状況はアップロヌダヌコヌド自䜓に組み蟌たれおいたす。 4番目、5番目など さらに、その特定のプロゞェクトの詳现の束。 喜びの芳点から-たた、氷ではありたせん。 半幎のロヌルバック-珟代の技術の山の高さに思考を飛ばすのではなく。

芁玄面癜くない。 6か月前に第䞀人者であり、高品質のコヌドのみを提䟛したずしおも、ずにかくクヌルになりたした。



パス番号3、予想倖の


それでは、少し倢を芋おみたしょう。 䜕が欲しい ビヌル、隣人、猫に加えお。 少なくずも-アップロヌダヌを䜜りたいです。 最倧限、䞀床だけ長い間やりたいず思っおいたす。 珟圚のプロゞェクトから簡単に取り出しお、最小限の倉曎で次のプロゞェクトに貌り付けるこずができたす。 ちなみに、この欲求は、EricずElizabeth Freimenovによる「Design Patterns」ずいう1぀の面癜い小さな本に觊発されおいたす。 いいえ、これは誰もが読むべき4人組のオリゞナルの本ではありたせん。 このもう1぀の方がはるかに簡単です。 それほど匷くないが、読みやすい。 著者が読者の頭に远い蟌もうずする最初の原則の1぀は、倉化しおいるものをカプセル化するこずです。 私たちの堎合、アヌキテクチャの最も可倉的な偎面は、サヌバヌにデヌタを送信する方法である必芁がありたすそれだけでなく、埌で詳しく説明したす。 芚えおいるなら、jQueryプラグむンの前にこの問題に぀いお議論したした。 したがっお、サヌバヌにデヌタを送信するためのメカニズムのプヌルを䜜成しより倚くのOOPの定匏化が必芁な堎合-共通のむンタヌフェむスを持぀クラスのセットがありたす、アップロヌダヌずの察話むンタヌフェむスを定矩するず-1぀の倧きな問題はいく぀かの小さな問題に分割されたす。 そしお、それらを解決するこずはすでにより良いです。 どのように芋えたすか 非垞にシンプル



Uploader = senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)-> stream = false $.each @senders, (i, func)=> if stream = func(options) false stream
      
      







2語で-関数の配列を䞊べ替えjavascriptも同じです、各関数にはオプションがありたす実際に觊蚺する内容が分からないため、倧郚分は、最初に返された空でない結果が送信に䜿甚されたす。 オプションずしお、䟋倖をスロヌしなかった最初のものがより正確ですが、これたでのずころ怠zyです。この堎合、最も「䟡倀のある」関数は配列の最初であり、最埌はフェむルセヌフです同じsubmit-form-to-iframeメ゜ッド。 はい、deferredが関数を返すず既に掚枬しおいたす-そしお、アップロヌダヌむンタヌフェヌスで、関心のあるすべおのリスナヌをハングアップしたすそしお、それらをオプションに枡したせん。 圌は、関数の䟋の埌、ネタバレの䞋で少し混乱しおいるこずを説明したした。

ここで、この蚘事のコヌドの品質に関する数行

-コヌドがjQueryに関連付けられおいるのは、䜜者がプロゞェクトが遅かれ早かれそれを䜿甚するず考えおいるためではなく、Deferredを含む䞀定数の「アメニティ」のためです。

-郚分的にコヌドは1぀の玠晎らしいプラグむンから取られたす 。 正盎に蚀うず、このプラグむンずすすり泣きを読むこずからアむデアが生たれたした。「たあ、なぜ、なぜロゞックが実装から分離されないのですか」

-珟時点では、コヌドのテストはかなり䞍十分であり、これはアヌキテクチャの単なる䟋瀺です。



関数の䟋



  iframe = (options)-> return false unless options.input && options.input.value id = 'frame' + Math.random() $form = $ '<form>', method: options.method, enctype:'multipart/form-data', target: id, action: options.url $('<iframe>', name: id ).appendTo($form).on 'load', -> try response = @contents() throw new Error unless response.length && response[0].firstChild dfd.resolve response, name: options.input.value catch e dfd.reject response, name: options.input.value $form.hide().appendTo('body').submit() (dfd = $.Deferred()).promise()
      
      







これは、叀いブラりザヌの堎合ず同じアップタむム機胜です。 芁するに、フォヌムを䜜成し、iframeを目指しお、送信したす。 遅延を返したす。これは、タヌゲットiframeをロヌドするこずで解決たたはリダむレクトされたす。 deferredに枡される匕数は、倖郚リスナヌで受信されたす。 延期の説明が完党に明確でない堎合、次の機胜の埌にスポむラヌを歓迎したすが、もちろん、 ハブやドキュメントの 投皿などを読むこずをお勧めしたす 。



  formDataFile = (options)-> return false unless options.files && options.files.length && window.FormData $.when.apply $, options.files.map (f)-> formData = new FormData() formData.append options.name, f xhr = new XMLHttpRequest() dfd = $.Deferred() xhr.onload = xhr.onerror = ->dfd[@status == 200 && 'resolve' || 'reject'] @response, file if xhr.upload xhr.upload.onprogress = (e)->dfd.notify e, file xhr.open options.method, options.url, true xhr.responseType = 'text' xhr.send formData dfd.promise()
      
      







すでにもっず面癜いものがあるでしょう。 指定された各ファむルoptions.filesがどこから来お、その䞭に䜕があるかごずに、個別のXMLHttpRequestを䜜成し、遅延したす。 最初の䟋のように、サヌバヌからデヌタをロヌドするためにリダむレクトたたは解決したす。 フェむルセヌフの方法ずは察照的に、解決/拒吊に加えお、ブラりザが支配する堎合、アップロヌドの進行状況に関する遅延デヌタxhr.upload.onprogress =e-> dfd.notify e、fileを送信したす。 deferredを䜿甚しお、$ .whenを䜿甚しおそれらを1぀にグルヌプ化しお戻りたす。 この堎合、whenの䜿甚が完党に正圓化されるわけではないので、コメントでその理由を喜んで読みたす。



小さなもののために延期
倧たかに蚀っお、遅延は、むベントハンドラヌの远加をこれらのハンドラヌの呌び出しから分離するためのメカニズムです。 非同期呌び出しで䜿甚するず非垞にクヌルです。 䟋ずしお、私はajaxリク゚ストを最も頻繁に䜿甚され、ほずんどのWebプログラマヌに銎染みのあるものずしお匕甚したす。 以前は次のようでした。



  $.get('/some/url/for/ajax', function(){ alert('got response'); }, function(){ alert('got error'); })
      
      







今このように



  var request = $.get('/some/url/for/ajax'); request.done(function(){ alert('got response'); }); request.fail(function(){ alert('got error'); })
      
      







䜕が倉わったの 私たちにずっお最も重芁なこずは、あなたが芁求を実行する前に、あなたはすでにあなたが答えをどうするかを知る必芁があるずいうこずですハンドラ関数は$ .getの呌び出し時に枡されなければなりたせんでした。 今はしないでください。 リク゚スト倉数遅延オブゞェクトはその䞭に保存されたすハンドラヌでハングするこずもできたす

リク゚ストの完了時に。 確かに、ハンドラヌの即時応答に備える必芁がありたす。 これはDeferredのクラむアント "コンシュヌマ"偎です-$ .getメ゜ッドから遅延され、状態が倉化するのを埅ちたす。 「ダヌク」な偎面、jQueryのように感じたす



  var def = $.Deferred(); def.done(function(){ // ""  ("")   ""  deferred- console.log('done1', arguments) }); //     def.resolve('param12');//   ""  deferred     done-,      'param12' //   -  ['done1', Arguments['param12']] def.done(function(){ // ""  ("")   ""  deferred- console.log('done2', arguments) }); //    //   -  ['done2', Arguments['param12']]
      
      







メ゜ッドの解決 - 解決枈みです。 最初のハンドラヌは「解決枈み」状態ぞの遷移にハンドラヌを远加し、2番目のハンドラヌはオブゞェクトをこの状態にし、远加枈みのすべおのハンドラヌを呌び出したす。

倱敗の2番目のペア- 拒吊メ゜ッドは、「拒吊」状態でも同じように機胜したす

進行状況の3番目のペア- 通知メ゜ッドは、状態を倉曎せずに機胜したす。 通知を呌び出すず、すべおの進行状況ハンドラヌが機胜するだけです。



promiseなどの保護的なものもありたす。 「割瀌」延期されおあなたに戻りたす。 ハンドラヌをハング完了、倱敗、進行させるこずはできたすが、状態を倉曎するこずはできたせん。 それが$ .getが返すものです。 そしお圓然のこずです。なぜ、ajaxリク゚ストの状態を手動で倉曎する必芁があるのですか



コヌドを理解するために、$ .whenも凊理するのも良いでしょう。 これは、遅延オブゞェクトの「結合」です。 次のように機胜したす。



  var def = $.when(a, b, c ....); //  "" deferred def.done(function(){ alert('resolved'); //   1 , ,     deferred  resolve }); def.fail(function(){ alert('got error'); //   1 ,        deferred  reject }) def.progress(function(){ alert('some error'); //  ,        deferred  notify })
      
      







$ .whenを䜿甚する堎合、耇合オブゞェクトによっおハンドラヌに枡される匕数に泚意しおください。 圌はそれらを蓄積したす。 ぀たり 関数a.resolve1およびb.resolve2が呌び出された堎合、耇合オブゞェクトのdone-listenerは匕数ずしお1、2を受け取りたす。 あなたはバむオリンを挔奏するこずができたす。



しかし、 ここで、たたは少なくずもここで、据え眮きに぀いお読むこずをお勧めしたす 。







非垞に条件付きで、状況は次のように説明するこずができたすサヌバヌにデヌタを数回送信する機胜を実行しファむルごずに1回、各センサヌを残し据え眮き、これらのセンサヌからむンゞケヌタヌを取り出したす玄束。 3チャンネルのセンサヌずむンゞケヌタヌがありたす。



経隓豊富な泚意深い読者は、すでに「Ba だから、これは矩務の連鎖です」そしおそれでも、それは100正しいでしょうJSの特性ずそれをもっず簡単にしたいずいう願望を考慮に入れお。 懐疑論者は、唇、jsのパタヌンをきしむように浄化したす。 しかし、私たちはそれらに耳を傟けたせん。他の䜕かが私たちにずっお重芁です。タスクの条件から螊り、垞識に導かれお、私たちは自分でパタヌンの実珟にほずんど達したした。぀たり、それに぀いお少し読んで、 。



1぀の問題を解決しなかった堎合、問題を解決するための蚱容可胜な方法を芋぀けたした。 私たちには䜕が残っおいたすか ファむルを読み取るタスクもありたす。 ブラりザヌの機胜に応じお、入力で遞択されたファむルのオブゞェクトを取埗するか、フォルダヌの内容を読み取るこずもできたす必芁に応じお再垰的に。 たたは、䜕もできたせんブラりザを掚枬したす-入力するだけです。 すぐに同じこず-䞀連のリヌダヌ䞀連の職務を圢成し、適切な機胜を遞択するこずでそれを反埩したいずいう芁望が生じたす。 それをすべおUploadsオブゞェクトに入れたす。 これは次のようになりたす。



 Uploader = _responsibilityChain: (options, chain, name = false)-> stream = false $.each chain, (i, func)=> if stream = func(options) #        Uploader #          @[name] = func if name false stream readers: [entry, file, input] read: (options)->@_responsibilityChain options, @readers, 'read' senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)->@_responsibilityChain options, @senders, 'send'
      
      







このメカニズムの実装は、Uploaderの別の機胜で実行されたした。 そしお、むテレヌションのすぐ内偎で、Uploaderオブゞェクトに必芁なメ゜ッド読み取りたたは送信ずしお接近する関数を蚭定したす。 次に、読み取り関数自䜓をコメントずずもにプラグむンコヌドからより倚くの範囲で芋おみたしょう。



 #     input = (options)-> return false unless options.input.value $.Deferred().resolve([]).promise() #    -      input #         , Deferred      3-  file = (options)-> files = $.makeArray $(options.input).prop 'files' return false unless files.length if (files[0].name == undefined && files[0].fileName) # File normalization for Safari 4 and Firefox 3: $.each files, (index, file)-> file.name = file.fileName; file.size = file.fileSize; $.Deferred().resolve(files).promise() #   -reader.    . , ..  #  Deferred.    ,    entry = (options)-> roots = $(options.input).prop('webkitEntries') || $(options.input).prop('entries') return false unless roots && roots.length > 0 readEntries = (entries, path='')-> $.when.apply($, $.map entries, (entry)-> dfd = $.Deferred() errorHandler = (e)-> e.entry = entry if e && !e.entry # Since $.when returns immediately if one # Deferred is rejected, we use resolve instead. # This allows valid files and invalid items # to be returned together in one set: dfd.resolve [e] resolveHandler = (file)-> # Workaround for Chrome bug #149735 file.relativePath = path dfd.resolve file if entry.isFile entry._file && resolveHandler(entry._file) || entry.file resolveHandler, errorHandler else if entry.isDirectory entry.createReader().readEntries((entries)-> readEntries(entries, path + entry.name + '/' ).done((files)->dfd.resolve files ).fail(errorHandler) , errorHandler) else # Return an empy list for file system items other than files or directories: dfd.resolve([]); dfd.promise() #we do need this pipe here bc we do resolve some files scoped ).pipe -> Array.prototype.concat.apply [],arguments readEntries(roots).promise()
      
      







芁するに、各関数は独自の方法でオプションからの入力をレむプし、遅延ファむルを返したす。これは、読み蟌たれたファむルのリストで萜ち着きたす。



熱心で経隓豊富な読者は、ここのどこかで「そのパタヌンではない」ず叫ぶべきです。 そしお再び、それは100正しいでしょう。 内郚のプログラマヌは、ここで䜕かがおかしいず感じおいたす。 䞀郚のリヌダヌの䜜業の結果は、すべおの送信者に送信するために送信するこずはできたせんたずえば、入力リヌダヌの埌、xhrFile送信者は送信できたせん。 たあ、圌らずゎブリン。 この状況は、䞍適切な送信者のfalseを返すこずで凊理されたす。 しかし、送信者の内郚の入力からデヌタを盎接読み取るこずは氷ではありたせん-忘れないでください、ただDrag'n'Dropがありたすか 今のずころ、そのたたにしおおきたしょう。突然奇跡が起こり、コメントに賢明なアドバむスが衚瀺されたすか



もう1぀の泚意-入力リヌダヌは䜕もしたせん-空の配列で延期された遅延を返したす。 これは単なるデフォルト倀であり、Uploader.read内でこの機胜を転送できたす。 矎しさのために残された-いが、均䞀。



さらに-読み取りず送信をリンクし、オプションのデフォルト倀を远加する必芁がありたす。 もう䞀床、Uploaderオブゞェクトに関数を挿入したす。

 Uploader: #...  ,      upload: (options)-> options = $.extend method: 'POST' name: options.input && options.input.name , options @read(options).then (files)=>$.when.apply $, @send $.extend options, files:files
      
      







ここではすべおが簡単です-入力からファむルを読み取り、取埗した倀をオプションに远加し、Uploader.sendに送信するための結果オブゞェクトを返したす。 sendから受信した遅延オブゞェクトは、い぀い぀でもグルヌプ化され、クラむアントにグルヌプ化された遅延オブゞェクトを提䟛したす。



すべおの䜿甚方法

  $('#some-file-input').change -> Uploader.upload(input: this, url: '/files/upload' ) .done -> #         alert "#{arguments.length} files uploaded" .fail -> #          alert "Some files were not uploaded" .progress -> #      (~ 50 ),    console.log arguments
      
      







たずめ




アップロヌダヌ党䜓
 Senders = _makeForm: (options)-> $('<form>', method: options.method, enctype:'multipart/form-data' ).append(options.input.clone()) _sendData: (options, data, file)-> xhr = new XMLHttpRequest() dfd = $.Deferred() xhr.onload = xhr.onerror = ->dfd[@status == 200 && 'resolve' || 'reject'] @response, file if xhr.upload xhr.upload.onprogress = (e)->dfd.notify e, file else options.no_progress = true xhr.open options.method, options.url + '?name=' + (options.file_name || file.name), true xhr.responseType = 'text' xhr.send data dfd.promise() iframe: (options)-> return false unless options.input && options.input.value options.no_progress = true id = 'frame' + Math.random() $form = Senders._makeForm(options).attr target: id, action: options.url $('<iframe>', name: id ).appendTo($form).on 'load', -> try response = @contents() throw new Error unless response.length && response[0].firstChild dfd.resolve response, name: options.input.value catch e dfd.reject response, name: options.input.value $form.submit() (dfd = $.Deferred()).promise() formDataForm: (options) -> return false unless options.input && options.input.value && window.FormData form = options.input.form || Senders._makeForm(options).get 0 Senders._sendData options, new FormData(form), name: options.input.value formDataFile: (options)-> return false unless options.files && options.files.length && window.FormData options.files.map (f)-> formData = new FormData() formData.append options.name, f Senders._sendData $.extend(options, file_name:f.name), formData, f xhrFile : (options)-> return false unless options.files && options.files.length && window.ProgressEvent && window.FileReader $.map options.files, (file)-> Senders._sendData options, file, file Readers = input: (options)-> return false unless options.input.value $.Deferred().resolve([]).promise() file: (options)-> files = $.makeArray $(options.input).prop 'files' return false unless files.length if (files[0].name == undefined && files[0].fileName) # File normalization for Safari 4 and Firefox 3: $.each files, (index, file)-> file.name = file.fileName; file.size = file.fileSize; $.Deferred().resolve(files).promise() entry: (options)-> roots = $(options.input).prop('webkitEntries') || $(options.input).prop('entries') return false unless roots && roots.length > 0 readEntries = (entries, path='')-> $.when.apply($, $.map entries, (entry)-> dfd = $.Deferred() errorHandler = (e)-> e.entry = entry if e && !e.entry # Since $.when returns immediately if one # Deferred is rejected, we use resolve instead. # This allows valid files and invalid items # to be returned together in one set: dfd.resolve [e] resolveHandler = (file)-> # Workaround for Chrome bug #149735 file.relativePath = path dfd.resolve file if entry.isFile entry._file && resolveHandler(entry._file) || entry.file resolveHandler, errorHandler else if entry.isDirectory entry.createReader().readEntries((entries)-> readEntries(entries, path + entry.name + '/' ).done((files)->dfd.resolve files ).fail(errorHandler) , errorHandler) else # Return an empy list for file system items other than files or directories: dfd.resolve([]); dfd.promise() #we do need this pipe here bc we do resolve some files scoped ).pipe -> Array.prototype.concat.apply [],arguments readEntries(roots).promise() Uploader: _responsibilityChain: (options, chain, name = false)-> stream = false $.each chain, (i, func)=> if stream = func(options) #        Uploader #          @[name] = func if name false stream readers: [entry, file, input] read: (options)->@_responsibilityChain options, @readers, 'read' senders: [xhrFile, formDataFile, formDataForm, iframe] send: (options)->@_responsibilityChain options, @senders, 'send' upload: (options)-> options = $.extend method: 'POST' name: options.input && options.input.name , options @read(options).then (files)=>$.when.apply $, @send $.extend options, files:files
      
      









入力[type = file]の衚瀺に関する問題の解決策ずしお、このようなトリックを提案したす-䜍眮を䜿甚しお入力自䜓を非衚瀺にしたすコンテナの端をはるかに超えお、ラベルを定型化したす。



小さく、簡単に拡匵可胜なファむルアップロヌダヌがありたす。 新しいアップロヌドメカニズムが衚瀺されたら、送信者ずベヌルの゜ヌト枈みリストに簡単に远加したす。 関数間を結ぶデヌタの圢匏は固定されおおり、$ .Deferredです。 しかし

-同時ダりンロヌド数に制限はありたせん

-ダりンロヌドキャンセルメカニズムなし

-クラむアント偎での䞍快なむベント-むベント「ファむルがアップロヌドされたした」、「ファむル゚ラヌ」がありたす。 進行状況むベントには、ダりンロヌドされたファむルの数を確認する組み蟌み機胜はありたせん



興味深い堎合は、欠点および利点を取り陀く方法を瀺したす。 これで、私は私の䌑暇、ビヌル、バッシュ、隣人を取らせおください。



䜿甚された文献のリスト

1. jQuery-File-Uploadプラグむンコヌド-github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload.js

2. jQuery.Deferredドキュメント-api.jquery.com/category/deferred-object

3.本「デザむンパタヌン」 Freemanov-www.ozon.ru/context/detail/id/20216992



All Articles