手元にあるファイルをサーバーに送るときの方法です。
雑談
よく忘れてよく調べるので、
まとめます。
ファイルのアップロードはちょこまかする機会ありますね。
req.file
説明
率直に、長いし何言っとるかわからんのだよね。
僕は、英語は雰囲気読みで、コアな専門用語はちんぷんかんぷんです。
素直に勉強不足。。。
"使い方" をコピペすればできるようにします。
使い方
HTML
<form action="/uploadfile" enctype="multipart/form-data" method="POST" target="_blank">
<input name="image" type="file">
<input type="submit" value="アップロード">
</form>
(<pre>すると自動で変換されるの、したくないときどうするんでしょう?)
enctype="multipart/form-data"
これはおまじない。
ファイルをアップロードするときは付けるらしい。
細かいところは知りません。
Controller
/** * RoomController * * @description :: Server-side actions for handling incoming requests. * @help :: See https://sailsjs.com/docs/concepts/actions */ module.exports = { /** * `RoomController.uploadfile()` */ uploadfile: async function (req, res) { req.file('image').upload(function (err, uploadedFiles) { if(err) return res.serverError(err); return res.json({ files: uploadedFiles }); }); } };
req.file(' { field } ').~
ってとこの "field" と、
type="file" の name を同じにしましょう。
アップロードするときは、
req.file( ~ ).upload( ~ );
function 内は、エラー処理とアップロード結果をJSONで出力してます。
{ "files": [ { "fd": "/app/app1/.tmp/uploads/8542d5f2-dc48-4e5d-9cbe-7b1a11abf160.png", "size": 154128, "type": "image/png", "filename": "sailsliftWebapp1.png", "status": "finished", "field": "image" } ] }
fd は、サーバー側に保存するときのファイルパス。
size は、サイズ。
type は、ファイルの形式。例は、png。
filename は、送信前のファイル名。
status は、ステータス。
field は、field。
保存時のファイルパスは、デフォルトで、
"./tmp/uploads" 下に置かれます。
ファイルパスを変えたいときは、
var uploadDir = process.cwd() + '/assets/images'; req.file('image').upload({ dirname: uploadDir }, function (err, uploadedFiles) { if(err) return res.serverError(err); return res.json({ files: uploadedFiles }); });
こう。
dirname オプションで指定しましょう。
書式はよく見るように。
process.cwd() は、sails lift をしたところのディレクトリ名を参照してます。
assets/images に保存することで、
http://{ ~~~ }/images/{ fd のファイル名 }
で見ることができるようになります。
まとめ
ファイルアップロードはこんな感じです。
大丈夫かな?
あんまりちゃんと解説できてないですよね。。。
こうゆうところは定型なので、細かいことは気にしないで行きましょう!