
рд╣рд╛рдп рд╣рдорд░! рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЛ
рдУрдкрди-рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓рдПрдкреАрдЖрдИ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рджреМрд░рд╛рди рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдиреЗ
670+ рд╕рд┐рддрд╛рд░реЗ рдФрд░
90+ рдХрд╛рдВрдЯреЗ рдЕрд░реНрдЬрд┐рдд рдХрд┐рдПред рдЧрд┐рддреБрдм рд╕рдореБрджрд╛рдп рдХреА рдорджрдж рд╕реЗ, рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реА "рдмрдЪреНрдЪреЛрдВ рдХреА" рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдХрдИ рд╕реБрдзрд╛рд░ рдХрд┐рдПред
100 рд╕реЗ
рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд▓реНрдпрд╛ рд▓реЗрдмреЗрджреЗрд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЬ, рдореИрдВ рдЧрд░реНрд╡ рд╕реЗ
FileAPI 2.0 рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рддреЛ, рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдереАрдВ:
- рдПрдХрд╛рдзрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдЪрдпрди;
- рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдирд╛рдо, рдЖрдХрд╛рд░ рдФрд░ рдорд╛рдЗрдо рдкреНрд░рдХрд╛рд░);
- рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рдкреАрдврд╝реА;
- рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рдХреНрд░реЙрдкрд┐рдВрдЧ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдШреБрдорд╛рд╡;
- рд╕рд░реНрд╡рд░ + CorS рдХреЛ рд╣реБрдЖ рд╕рдм рдХреБрдЫ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛;
- IE6 рд╕рд╣рд┐рдд рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреНрд▓реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ "рд╕реЗрд▓реЗрдХреНрдЯ рдлрд╛рдЗрд▓реНрд╕" рдмрдЯрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд╛рдЗрд▓рдПрдкреАрдЖрдИ рдРрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореВрд▓ рдПрдХ рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд╣реИ, рдЕрд░реНрдерд╛рддред рдПрдЪрдЯреАрдПрдордПрд▓ 5:
<span class="js-fileapi-wrapper"> <input id="file" type="file" multiple /> </span> <script> var input = document.getElementById("file"); FileAPI.event.on(input, "change", function (){ var list = FileAPI.getFiles(input); </script>
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░, рдЕрдЧрд░ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдлреНрд▓реИрд╢ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдмрд╛рдж, рдореБрдЭреЗ рдкрд╣рд▓реА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╕реБрдЭрд╛рд╡ рдорд┐рд▓рдирд╛ рд╢реБрд░реВ рд╣реБрдЖ, рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рджреЗ рджреВрдБрдЧрд╛ред
рдУрдлрд┐рд╕рдХреЗрд╢рди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐
рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдереА
(api.expando + ++gid)
ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрд╕рдХреЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ рдФрд░ рдмрд╕ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ
(++gid, api.expando + gid)
ред
рдЕрдореЗрдЬрд╝реЕрди рдПрд╕ 3 рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рдЬрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ url рдХреЗ рд▓рд┐рдП FileAPI.upload рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдкрд░ POST рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп GET рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдЕрдореЗрдЬрд╝реЕрди рдПрд╕ 3 рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЬреАрдИрдЯреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреИрд╢ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЬреАрдИрдЯреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЬрдмрд░рди рдкреАрдПрдирдЬреА рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдмрджрд▓ рдЧрдпрд╛, рдЬреЛ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╡реЗрдмрдХреИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
тАЬрдмрд┐рдирд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЪреВрдВрдХрд┐ рдПрдкреАрдЖрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛,
FileAPI.upload
рд╡рд┐рдзрд┐
FileAPI.upload
рддреНрд░реБрдЯрд┐
FileAPI.upload
рдЬрдм рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЦреБрдж рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлреЙрд░реНрдо рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдлрд╝реАрд▓реНрдб рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрддреА рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦрд░рд╛рдм рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдХреЛрдб рдХреА рдХрдореА (рд╕реНрд░реЛрдд рдХреЛрдб рдерд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ "рд╕рд╛рдЗрдХрд┐рд▓" рдХреА рдорджрдж рд╕реЗ рд╕рдВрдкреАрдбрд╝рд┐рдд) рдиреЗ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА рдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд╡рд░рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ jQuery рдкреНрд▓рдЧрдЗрдиред рдЗрд╕рд▓рд┐рдП, рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЬреЛ рд╕рднреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ред
рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рдХреА рдЧрдИ:
- рдЧреНрд░рдВрдЯ - рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг;
- рдХреНрд╡рдирд┐рдЯ - рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг (рдЧреНрд░рдВрдЯ + рдлреИрдВрдЯрдордЬреЗрдПрд╕);
- рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ - рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рд╡реЗрдмрдХреИрдо рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдХрд╛рдо;
- jQuery рдкреНрд▓рдЧрдЗрди - рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдкрд░-рдбреБрдкрд░ рдкреНрд▓рдЧрдЗрди;
- рдкреНрд░рд▓реЗрдЦрди - рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгред
рдШреБрд░рдШреБрд░рд╛рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, js рдХреЛ рдПрдХ рдЖрджрд┐рдо рд▓рд┐рдкрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдВ 6 рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдорд░реНрдЬ рдФрд░ рдСрдмрдлреБрд╕реЗрдЯ рдХрд░рддрд╛ рдерд╛ред рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдпрд╛ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ 6 рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдЧреНрд░рдВрдЯ рдХреЛ рдРрд╕реЗ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рд╣реИред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рд╣рдо рди рдХреЗрд╡рд▓ FileAPI рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐
JSHint рдФрд░
Qunit рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдХреЛрдб рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред рдЧреНрд░рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдкреИрдХреЗрдЬ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Gruntfile.js рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬред
рдЪрд▓рд┐рдП
Gruntfile.js рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░
рдбрд╛рд▓рддреЗ рд╣реИрдВ ред рдЗрд╕рдореЗрдВ 5 рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
JSHint
рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛
JSLint рд╕реЗ рдПрдХ
рдЕрдкрд░рд╛рдз рд╣реИ ред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЗрдПрд╕рд╣рд┐рдВрдЯ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реИрд▓реА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓рд╛рдкрддрд╛ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо, рдХрд┐рд╕реА рд╕рд░рдгреА рдпрд╛ рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдорд╛, рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдФрд░ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
concat
рдПрдХ рдореЗрдВ рдлрд╛рдЗрд▓ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред FileAPI рдореЗрдВ, рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, `all` рдФрд░` html5`, рдЬреЛ рджреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ: рдлреНрд▓реИрд╢ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЛрдмрд╛рдЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдПред
рдХреБрд░реВрдк рдХрд░ рджреЗрдирд╛
рдХреЛрдб рдХрд╛ рд╡рд┐рд░реЛрдз, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреЙрдиреИрдЯ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдШрдбрд╝реА
рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрдИ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдп js рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░
рдХреЙрдиреНрдХреИрдЯ рдХрд╛рд░реНрдп рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред
qunit
PhantomJS рдХреА рдорджрдж рд╕реЗ,
Qunit рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЧреНрд░рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
npm install
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
рдЕрдм рд╣рдо рдХрд╛рд░реНрдп рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
$ /FileAPI/ > grunt
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (jshint + build)
$ /FileAPI/ > grunt build
- рдмрд┐рд▓реНрдб рдФрд░ рдСрдмреНрд╕рд╕рдХреЗрдЯ (concat + uglify + qunit)
$ /FileAPI/ > grunt watch
рдкрд░реАрдХреНрд╖рдг
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ,
рдХреНрд╡рдирд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреА рд╕реБрдЧрдорддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдЖрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░
- рд╕реЗ-
рдЧрдВрднреАрд░ рдХрд╛рдо рд╣реИред
PhantomJS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрд╕реНрдЯ рдЪрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЖрдк рдХреЗрд╡рд▓ рдкреГрд╖реНрда рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдорд╛рдирдХ рдЧреНрд░рдВрдЯ рдХрд╛рд░реНрдп рдореЗрдВ рдЖрдк рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдирд╣реАрдВ рдмрд╛рдБрдз рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛
рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛:
qunit: { options: {
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА (рдирд╛рдо, рдкреНрд░рдХрд╛рд░, рдЖрдХрд╛рд░, рдПрдХреНрдЬрд┐рдлрд╝), рдкрдврд╝рдиреЗ рдХреА рд╕рд╛рдордЧреНрд░реА (рдбреЗрдЯрд╛реБрд░, рдмрд╛рдЗрдирд░реАрд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЖрдЧреЗ рдХрд┐рд╕ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИ, рдпрд╣ рд╕рдм рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЪреВрдВрдХрд┐ рдлрд╛рдЗрд▓рдПрдкреАрдЖрдИ "рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕" рджрд┐рдП рдЧрдП рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЫрд╡рд┐ рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рджреЛ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реНрд░реЛрдд рд╡рд╛рд▓реЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрджрд░реНрдн рд╡рд╛рд▓реЗ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ? FileAPI рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ dataURL рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдореБрдЦрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддреБрд▓рдирд╛ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╡рд┐рд╕рдВрдЧрддрд┐ <1% рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
function imageEqual(actual/**Image*/, expected/**Image*/, message/**String*/){ actual = toCanvas(actual); expected = toCanvas(expected); if( actual.width != expected.width ){ ok(false, message + ' (width: ' + actual.width + ' != ' + expected.width + ')'); } else if( actual.height != expected.height ){ ok(false, message + ' (height: ' + actual.height + ' != ' + expected.height + ')'); } else { var actualData = actual.getContext('2d').getImageData(0, 0, actual.width, actual.height); var expectedData = expected.getContext('2d').getImageData(0, 0, expected.width, expected.height); var pixels = 0, failPixels = 0; for( var y = 0; y < actualData.height; y++ ){ for( var x = 0; x < actualData.width; x++ ){ var idx = (x + y * actualData.width) * 4; pixels++; if( !pixelEqual(actualData.data, expectedData.data, idx) ){ failPixels++; } } } ok(failPixels / pixels < .01, text + ' (fail pixels: ' + (failPixels / pixels) + ')'); } } function pixelEqual(actual, expected, idx){ var delta = 3;
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐
рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдлреИрдВрдЯрдо, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕, рдХреНрд░реЛрдо) рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд░рдВрдЧ рдкреНрд░рддрд┐рдкрд╛рджрди рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред рд╕рдлрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдмрди рдЧрдИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджрд░реНрдн рдЪрд┐рддреНрд░ рд╕рд╣реЗрдЬреЗ, рди рдХрд┐ рд╕рд░реНрд╡рд░ рдХреА рддрд░рдлред рддреЛ, рд╕рдлрд╛рд░реА рдореЗрдВ, рдбреЗрдЯрд╛URL рдФрд░ рдПрдХ рд╕рд╣реЗрдЬреЗ рдЧрдП рдбрд┐рд╕реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рдЫрд╡рд┐ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд░рдВрдЧ рд╡рд┐рдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред
рдХрд╛рд╢, рдпрд╣ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрд╣рд╛рдВ рдлреНрд▓реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЧреНрд░рдВрдЯ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд╡рд┐рдВрдЯ рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдПрдЧрд╛, рдлрд┐рд░ рд╣рдо рд▓рд╛рдЗрд╡ рд╣реЛрдВрдЧреЗред
рд╕реБрд╡рд┐рдзрд╛рдУрдВ
рдЧреНрд░рдВрдЯ, рдкрд░реАрдХреНрд╖рдг рдмреЗрд╢рдХ, рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 2.0 рдкрд░ рдирд╣реАрдВ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рдЫрд╡рд┐ рдУрд╡рд░рд▓реЗ
рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рдмрд╛рдж, рдореБрдЭрд╕реЗ рдкреВрдЫрд╛ рдЧрдпрд╛ рдХрд┐ рдХрд┐рд╕реА рдЪрд┐рддреНрд░ рдкрд░ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрдирд╡рд╕ рддрдХ рд╕реАрдзреА рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐
jQuery FileUpload рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рд╕рдВрд╕реНрдХрд░рдг 10 рд╕реЗ рдиреАрдЪреЗ IE рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдлреНрд▓реИрд╢ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рд▓рдЪреАрд▓реА рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
FileAPI.Image(file) .overlay([ { x: 10, y: 5,
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рдирд╛рдо рдХреА рд╕рдВрдкрддреНрддрд┐ рдЫрд╡рд┐ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИ:
FileAPI.upload({ imageTransform: { overlay: { x: 5, y: 5, rel: FileAPI.Image.CENTER_TOP, src: "watermark.png"
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рдзрд┐ рд╕рд░рд▓, рд▓реЗрдХрд┐рди рд▓рдЪреАрд▓реА рд╣реЛ рдЧрдИред
рд╡реЗрдм рдХреИрдорд░рд╛
рдореБрдЦреНрдп рдирд╡рд╛рдЪрд╛рд░ рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
navigator.getUserMedia рдкрджреНрдзрддрд┐ HTML5 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреАред рдЙрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
http://jsfiddle.net/RubaXa/uZhRp/ function setWebCam(video/**HTMLVideo*/, doneFn/**Function*/) { var navigator = window.navigator; var getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; getMedia.call(navigator, { video: true
рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЫрд╡рд┐ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓рдмреИрдХ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдВрдХреЗрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреА рдереА:
http://jsfiddle.net/RubaXa/uZhRp/рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ function setWebCam(video/**HTMLVideo*/, doneFn/**Function*/) { function _detectVideoSignal() { var canvas = document.createElement('canvas'), ctx, res = false; try { ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, 1, 1); res = ctx.getImageData(0, 0, 1, 1).data[4] != 255; } catch (e) {} return res; } var navigator = window.navigator; var getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; getMedia.call(navigator, { video: true }, function (stream) { var pid, URL = window.URL || window.webkitURL || window.mozURL; pid = setInterval(function () { if (_detectVideoSignal()) { clearTimeout(pid); doneFn(); } }, 100);
рдХрд╛рд╢, рд▓реЗрдЦрди рдХреЗ рд╕рдордп,
navigator.getUserMedia
рдкрджреНрдзрддрд┐ рдХреЗрд╡рд▓ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рдХреНрд░реЛрдо
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ , рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдлреНрд▓реИрд╢ рдореЗрдВ рдХрдордмреИрдХ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдкреАрдЖрдИ рдорд┐рд▓реЗ:
var el = document.getElementById('container');
FileAPI.Camera
- рдкреНрд░рдХрд╛рд╢рд┐рдд (рдПрд▓, рд╡рд┐рдХрд▓реНрдк, рдХреЙрд▓рдмреИрдХ) - рдПрдХ рдХреИрдорд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐;
- start (рдХреЙрд▓рдмреИрдХ) - рдкреНрд░рд╕рд╛рд░рдг рд╢реБрд░реВ рдХрд░рдирд╛;
- рд╢реЙрдЯ () - рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдмрдирд╛рдПрдВ, рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реМрдЯрд╛ рджреЗрдВред
- stop () - рдХреИрдорд░рд╛ рдмрдВрдж рдХрд░реЛред
рдлрд┐рд▓реНрдЯрд░
рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдХреБрдЫ рдФрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдореИрдВ рдЧрд▓рддреА рд╕реЗ рдЕрджреНрднреБрдд
CamanJS рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ, рдЬреЛ рди рдХреЗрд╡рд▓ рд░рдВрдЧ рд╕реБрдзрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рдЫрд╡рд┐ рд╕рдореНрдорд┐рд╢реНрд░рдг рдореЛрдб, рд╕рд╛рде рд╣реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП рдерд╛: рдПрдХ рдХреИрдорд░рд╛ рд╣реИ, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдВ, рдпрд╣ CamanJS рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ - рдФрд░ FileAPI, WebCam рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ "рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо" рддреИрдпрд╛рд░ рд╣реИред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, CamanJS рдореЗрдВ 10 рдкреВрд░реНрд╡-рд╕реНрдерд╛рдкрд┐рдд рдлрд┐рд▓реНрдЯрд░ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ
рдпрд╣рд╛рдВ рдФрд░
рдпрд╣рд╛рдВ рдХрд╛рдо рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
FileAPI.Image(file) .filter('hazyDays')
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреИрдирд╡рд╛рд╕ рд▓рд┐рдВрдХ рдФрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
FileAPI.Image(file) .filter(function (canvas, callback){
рдХрд╛рд╢, рдпрд╣ рд╕рдм рдХреЗрд╡рд▓ HTML5 рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ред рд╕рдЪ рдХрд╣реВрдВ рддреЛ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреНрд▓реИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ: рдмрд╕ рдлреНрд▓реИрд╢ рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рдФрд░ рд╕рдордпред
jQuery.FileAPI
рдЕрдВрддрд┐рдо рдирд╡рд╛рдЪрд╛рд░ jQuery рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреНрд▓рдЧрдЗрди рдерд╛ред рдЗрд╕рдореЗрдВ, рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреИрд╕реЗ:
- "рдПрдХ рдмрдЯрди" - рдЪреБрдиреЗрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ;
- "рд╕реАрдорд╛рдПрдВ" - рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдЫрд╡рд┐ рджреЛрдиреЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░;
- "рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ" - рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрддрд╛рд░ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛;
- "рдЫрд╡рд┐рдпрд╛рдВ" - рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди, рд░реЛрдЯреЗрд╢рди рдФрд░ рдлрд╕рд▓;
- "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" - рд▓рдЪреАрд▓рд╛ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕;
- рд╕рд╛рде рд╣реА Drag'n'Drop рдФрд░ WebCam ред
рдЖрдк
рдбреЗрдореЛ рдкреЗрдЬ рдкрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рдЧрд┐рдердм рдпрд╛ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрдХрд░ред
рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЕрд╡рддрд╛рд░ рдПрдХрд╛рдзрд┐рдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛, рдПрдХ рдЕрд╡рддрд╛рд░ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдЕрд░реНрдерд╛рддреН: рдПрдХ рдлреЛрдЯреЛ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛, рдХреНрд░реЙрдк рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ред рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдореЗрдХрдЕрдк <div id="userpic" class="userpic"> <div class="js-preview userpic__preview"></div> <div class="btn btn-success js-fileapi-wrapper"> <div class="js-browse"> <span class="btn-txt">Choose</span> <input type="file" name="filedata"> </div> <div class="js-upload" style="display: none;"> <div class="progress progress-success"><div class="js-progress bar"></div></div> <span class="btn-txt">Uploading</span> </div> </div> </div>
$("#userpic").fileapi({ url: "./ctrl.php", accept: "image/*", imageSize: { minWidth: 200, minHeight: 200 }, elements: {
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЦреИрд░, рдЕрдЧрд░ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдПрдХ рдмрдЧ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЧреАрдереВрдм рдкрд░ рдПрдХ
рдЯрд┐рдХрдЯ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдореБрдЭреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдореБрдЭреЗ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдмрд╣реБрдд рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдпреЗ рджреЛ рдкреВрд░реНрдг рд╕рд╛рдЗрдЯ рд╣реИрдВ:
рдЖрдк рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рднреА рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/mailru - FileAPI, рдЯрд╛рд░рдирдЯреВрд▓, рдЙрддреНрд╕рд╡ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ
github.com/rubaxa - рдореЗрд░рд╛ рдЬреАрдереВрдм
@ibnRubaXa