こんぶにのブログ

エンジニアという職業を通して学んだことを発信するブログです。

formでデータを送る時の違い。ファイルをアップロードするにはentypeを指定する必要あり。

POSTデータを送信

送るものによって色々種類を分ける必要あり

formに何も指定しなかった場合

input type fileで入力したデータのファイルの中身が送信されない。
だからファイルのアップロードには使えない。

chromeの開発者モードでcontent-typeを見てみるとこんな感じ

application/x-www-form-urlencoded```  
という謎のコンテンツタイプが追加されている。  
これがformに特に何も指定せずにsubmitした時のデフォルトらしい。  
以下に詳細。  

[https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/post-parameters#application%2Fx-www-form-urlencoded-%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B:title]  
formでデータを送る時の区切りの文字列の扱いだったり、改行の扱いだったりを定義している。  
要は、サーバがちゃんとpostデータの中身なんだなって認識するためのデフォルトの複雑なことが何もない時用の諸々のルール。  


###formのentypeにmultipart/form-dataを指定した場合
試しに送信してみるとbodyがこんな感じになっていた。  
[f:id:k0nbuni:20231126181103p:plain]  
リクエストのヘッダにはこんなものが追加されていた。  

multipart/form-data; boundary=----WebKitFormBoundaryK8oEoBaqC4Xlrzay```
boundary、つまりデータとデータの区切りはこの文字列ですよ~というのをヘッダに入れ込んでいる。
こうすることでファイルが始めてアップロードできるようになるらしい。
この構造にすると、たくさんの複雑なデータを持つことが出来る。
一つ上で紹介したデータの送り方だと、ひとつひとつ&とか=で区切るから、あんまり複雑なデータが送れない。
で、ここで言う複雑なデータっていうのがファイルのバイナリ。
バイナリっていうのはファイルをぐっちゃぐちゃな文字列にしたやつ。こいつは人間には理解できないが、コンピュータには理解できる。
コンピュータが読めば、「あ、これはこういうファイルなんだな」となる。