2016-11-08 7 views
0

ファイルのアップロードの処理の例、特に特定のフォルダに保存する方法が見つかりません。ここで蒸気を使ったファイルアップロード

はコードで、addVideoは、HTTP POSTマルチパート/フォームデータです:

videos.post("addVideo") { req in 

    // need to save req.multipart["video"] into /data/videos/ 

    return try JSON(node: ["status": 0, "message": "success"]) 
} 
+0

あなたはこれをチェックしたいかもしれません:http://stackoverflow.com/questions/38988329/uploading-files-using-vapor – Chris

答えて

2

あなたMultipart.FileBytesを取得し、Dataに変換から。

guard let file = request.multipart?["video"]?.file else { 
    return "Not found" 
} 
try Data(file.data).write(to: URL(fileURLWithPath: "/data/videos/FILENAME")) 

FILENAMEはFileオブジェクトから取得することも、独自に作成することもできます。

+0

ありがとう、それは動作します:しかし、データオブジェクトを作成せずにファイルにバイトを保存する方法はありますか?大きなファイルの場合、実行するまでに時間がかかりますが、ファイルシステムに保存する必要があります –

+0

ファイルの絶対パスを取得するのは誰ですか? file:/// path/to/folderのようなものがありますが、これは大丈夫ですが、私はhttps://myapp.herokuapp.com/images/image.jpgを持っています –

+0

私のために 'let d = Data(req.data 'プリミティブ')や 'let d =データ(req.body.bytes)'は動作しません。どうして? –

3

の例では、次のようになります。

蒸気2.0サーバコード:

let d =drop.grouped("file"); 
d.post("updateFile") { req in 
    let data = Data.init(bytes: (req.data["image"]?.bytes)!) 
    let picName = req.data["name"]?.string ?? String(); 
    try Data(data).write(to: URL(fileURLWithPath: "/Users/xx/Desktop/\(picName).jpg")) 
    return try JSON(node: ["status": 0, "message": "success"]) 
} 

クライアントコード:

Alamofire.upload(multipartFormData: { (multipartFormData) in 

     multipartFormData.append(imageData!, withName: "image", fileName: "pic", mimeType:"image/jpg") 

     multipartFormData.append("picName".data(using: .utf8)!, withName: "name") 

    }, to: "http://0.0.0.0:8083/file/updateFile") { (encodingResult) in 

     switch encodingResult { 
     case .success(let upload, _, _): 
      upload.responseJSON { response in 
       debugPrint(response) 
      } 
     case .failure(let encodingError): 
      print(encodingError) 
     } 
} 
+0

この例ではありがたいですが、これがどのように機能しているかはすでにわかりました。とにかく、私の主な関心事は、ファイルのバイトからDataインスタンスを作成することです。つまり、ファイルバイトをメモリにロードします。あなたがビデオをアップロードしたと想像してください。受信したバイトからデータを構築し、メモリにロードします。時間とラムが必要です。私が探しているのは、メモリにロードせずにファイルに保存する方法です。 –

1

他の回答には、ファイルとして次のコードに示すデータを保存する方法を説明しますがデータベースblobとしてデータを保存する方法:

guard 
    let name = request.data["filename"]?.string, 
    let blob = request.data["file"]?.bytes 
else { 
    throw Abort(.badRequest, reason: "Fields 'filename' and/or 'file' is invalid") 
} 
let user = try request.user() 
let image = try Image(filename: name, user: user, file: blob) 
try image.save() 
関連する問題