「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>アップロード・ダウンロード]]

* 目次 [#bd8e54b2]
#contents

*概要 [#wfafecc4]
ファイルのアップロードについての情報を纏めます。

*通常のアップロード方法 [#a015b334]

**Form-based File Upload [#z5b973ac]
RFC1867で規定されている模様。

-フォームよるファイルアップロードの仕様~
http://www.javadrive.jp/servlet/fileupload_tutorial/index2.html
--Form-based File Upload in HTML~
https://www.ietf.org/rfc/rfc1867.txt

***Content-Type [#e367a311]
multipart/form-dataを使用する。

-WWWブラウザのFormからファイルアップロードする一般的方法

-<INPUT type="file">を使用してアップロードできる。

--INPUT type=file-HTMLタグリファレンス~
http://www.htmq.com/html/input_file.shtml
 
***HTTP1.0 / 1.1メソッド [#qf3ba1b0]
-POSTメソッドを使用する。
-PUTは使用できない模様(後述)。

**その他 [#e777e3f4]

***HTTP1.0 / 1.1メソッド [#vfb43775]
PUTメソッドなども使用できるが、~
multipart/form-data とは組み合わせられない模様。~
(application/x-www-form-urlencodedでは動作する)

-HTTPメソッドのPOSTとPUTの使い分け - アインシュタインの電話番号~
http://blog.ruedap.com/2011/03/24/http-method-post-put
-php - REST PUT send data with multipart-form-data - Stack Overflow~
http://stackoverflow.com/questions/18530253/rest-put-send-data-with-multipart-form-data

***WebDAV追加メソッド [#fe706d33]

-WebDAV - Wikipedia~
http://ja.wikipedia.org/wiki/WebDAV

--ボディ部では、クライアント・サーバ双方ともXMLを用いる。

--HTTP 1.1(のメソッド)に加え

---GET 
---HEAD 
---POST 
---PUT 
---DELETE 
---OPTIONS

--次のメソッドが存在する。

---PROPFIND~
プロパティの取得
---PROPPATCH~
プロパティの変更
---MKCOL~
指定したURIの場所に新たな資源を作成する。
---COPY~
指定したURIが示す資源およびその属性値を別のURIにコピーする。
---MOVE~
指定したURIが示す資源およびその属性値を別のURIに移動する。
---LOCK~
指定したURIが示す資源のファイルロックを設定する。~
共有ロックと排他ロックの二種類が利用できる。
---UNLOCK~
指定したURIが示す資源のロックを解除する。

*大容量ファイルのアップロード [#lcf58b88]
大量データのアップロードには、以下の方式がある。
-[[分割アップロード>#o2cfe3b7]]
-[[その他の方法>#ad7b3a27]]
--[[MTOM>#w32a688f]]

Streaming、MTOMなどに対応している~
APサーバは少ないと考えられるため、~
分割アップロードが一般的設計と考える。

**分割アップロード [#o2cfe3b7]
主に、APサーバのStreaming対応の有無によって、~
分割アップロードが必要になることがある。

***必要性 [#h718965e]
Streaming対応が無いAPサーバでは、~
multipart/form-dataを全てメモリに溜め込んでしまうため、~
メモリ・リークに陥る。この対応として分割アップロードがある。

***選択肢 [#v42bb928]

-クライアントを作りこむ。~
HTTPクライアントライブラリ(API)を使用して~
ファイル分割アップロード処理を行うHTTPクライアントを開発する。

-JavaScriptライブラリを使用する。~
jQuery-File-Uploadを使用して、分割アップロードが可能。

--jQuery File Uploadを利用した大容量ファイルのアップロードをChunked uploadで実現する - KayaMemo~
http://kayakuguri.github.io/blog/2015/10/01/jquery-chunked-upload/

>以下も参考になるが、こちらは、ノーマルなjQueryのサンプルのもよう。

--asp.net MVCとjQueryでファイルアップロードするメモ | リグレックス社員ブログ~
http://blog.regrex.jp/2016/06/03/post-498/


***注意点 [#md91fb8b]
こちらと同様、2GB以上のファイルを扱えないケースがある。
-[[2GB制限>ダウンロードのいろいろ#h23ea62b]]

**その他の方法 [#ad7b3a27]

***MTOM [#w32a688f]
MTOM(Message Transmission Optimization Mechanism)

-BufferモードとStreamingモードがあり、後者でこの問題を解決できる。

-APサーバのStreaming対応が無い場合も、MTOMでStreamingがサポートされる。

-JavaScriptからMTOMのWebサービスは利用できないので~
Webサービス・クライアントの開発が必要になる。

-MTOMはWCFなどを使用したWebサービスで利用可能~
(対応可能かどうか?は使用するAPサーバ・フレームワークに依存)。

-参考

--大規模データとストリーミング | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/large-data-and-streaming

--WCF: Streaming Large Data Files~
https://www.c-sharpcorner.com/uploadfile/afenster/wcf-streaming-large-data-files/

----
Tags: [[:その他、開発の色々]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS