akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

PythonとJavaScriptでファイルアップロード(自分用備忘録)

PythonとかJavaScriptを使って画像やzipファイルをアップロードしたい時がある。
multipart/form-dataでpostするときにいつも忘れてしまうので、備忘録として残しておく。

Python
ローカルのファイルをアップロードするためのスクリプト

#!/usr/bin/python

import requests

with open("test.tgz", "rb") as f:
    tar_data = f.read()

url = "http://[web_ip]/upload/"

#name、filename、Content-Typeを指定
files = {'file': ('test.tgz', tar_data, "application/x-compressed-tar")}

#nameとfilenameに同じ値を指定する場合 =>  files = {'file': tar_data}
#nameとfilenameをそれぞれ指定する場合 =>  files = {'file': ('test.tgz', tar_data)}

headers = {'Cookie': 'JSESSIONID=xxxxxxx;'}
req = requests.post(url=url, files=files, headers=headers)

print(req.text)

JavaScript (fetchを使っているが、xhrでもよい)
別のサーバに置かれているファイルを取りに行って、それをアップロードするためにスクリプト
アップロード先のサーバとのセッションはすでに確立できているてい。

function upload_file() {
    
    fetch("http://[fileserver_ip]/test.tgz", {
        method: 'GET',
    })
    .then(response => response.blob())
    .then(data => {
            var form = new FormData();
            var tar_data = new Blob([data], { type: "application/x-compressed-tar" });
            form.append('file', tar_data, 'test.tgz');
            url = "http://[web_ip]/upload/";
            fetch(url, {method: 'POST',body: form})
            .then(response => response.text())
            .then(text => console.log("Success"))
            .catch(err => console.log("Failed"))
    }).catch(err => {
            console.log("Failed");
    });

}

upload_file();

とりあえずアップロードのスクリプトはこの辺おさえておけば大丈夫そう。