HTMLでは、マルチパートデータを含むフォーム:
_<form action="@routes.Files.upload" method="post" enctype="multipart/form-data">
<input type="hidden" name="groupId" value="1" />
<input type="hidden" name="tagId" value="2" />
<input type="file" name="file"/>
<input type="submit" value="upload it"/>
</form>
_
アクションの書き方_Files upload
_?
アップロードされたファイルを取得する方法を知っています:
_request.body.file("file") map {
filepart => filepart.ref.moveTo(newFile);
}
_
そして、提出された入力を取得する方法:
_Form(Tuple("groupId" -> text, "tagId" -> text)).bindFromRequest.fold(
errors => ...,
params => ....
)
_
しかし、それらをどのように組み合わせるのですか?
file
に適した型がForm(Tuple(...))
で使用できず、_request.body
_で入力値を取得する方法も見つかりません。
この答えはJava向けですが、Scalaにかなり簡単に適応できるはずです。
あなたがする必要があるのはあなたのフォームを除いてファイルのすべてのフィールドのためにモデルを定義することです。次に、通常どおりfile-uploadAPIを使用してファイルを取得します。
たとえば、これは私がしたことです:
フォーム(upload.scala.html内):
@form(action = routes.UploadResourceController.doUpload(), 'enctype -> "multipart/form-data") {
@inputText(uploadForm("lang"))
@inputText(uploadForm("country"))
@inputFile(uploadForm("resourceFile"))
<p>
<input type="submit">
</p>
}
モデル(models/UploadResource.Java):
public class UploadResource {
@Required
public String lang;
@Required
public String country;
/* notice a field for the file is missing */
}
コントローラー(controllers/UploadResourceController.Java):
public static Result doUpload() {
Form<UploadResource> filledForm = uploadForm.bindFromRequest();
if (filledForm.hasErrors()) {
return badRequest(views.html.upload.render(filledForm));
} else {
UploadResource resource = filledForm.get();
MultipartFormData body = request().body().asMultipartFormData();
FilePart resourceFile = body.getFile("resourceFile");
/* Check resourceFile for null, then extract the File object and process it */
}
}
これがお役に立てば幸いです。
Scalaの例:フォームフィールドが必要な場合:
モデル:
case class Specs (userid: String)
コントローラー:
object Upload extends Controller {
val uploadForm = Form(
mapping(
"userid" -> nonEmptyText
)(Specs.apply)(Specs.unapply)
)
def upload = Action(parse.multipartFormData) { implicit request =>
val sp : Option[Specs] = uploadForm.bindFromRequest().fold (
errFrm => None,
spec => Some(spec)
)
request.body.file("file").map { f =>
sp.map { spec =>
val filePath = ... // incorporate userid
// XXX: file read to memory b4 writing to disk. bad for large files
f.ref.moveTo(new File(filePath), replace=true)
Ok("File uploaded")
}.getOrElse{
BadRequest("Form binding error.")
}
}.getOrElse {
BadRequest("File not attached.")
}
}
}
これを行う別の例は次のとおりです。
モデル:
case class Specs(userId: String)
コントローラー
def upload = Action(parse.multipartFormData) { implicit request =>
uploadForm.bindFromRequest().fold(
hasErrors => Ok(ourFormHTML(hasErrors),
specs => {
request.body.file("inputFileFieldName") match {
case Some(file) => {
import Java.io.File
val filename = file.filename
val contetType = file.contentType
file.ref.moveTo(new File(Play.application().path().getAbsolutePath + file.filename))
Ok("congratz you did it")
}
case _ => Ok(ourHTML if we dont send file but want the form anyway)
}
}
)
何が悪かったのか疑問に思うかもしれないので、ファイルに名前を付けることを忘れないでください。
他のフォームパラメータを使用して、angularを使用してファイルをアップロードしていました。私は以下のように私のものを作成しました、そしてそれは働きます。
角度関数
Upload.upload({
url: '/api/upload',
method:'POST',
data: {
"file": user.profilePic, //file object
"username": user.username
}
}).then(function (resp) {
//console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
}, function (resp) {
console.log('Error status: ' + resp.status);
}, function (evt) {
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
//console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});
プレイ2.1コントローラー
/**
*
*Upload user profile
**/
public static Result upload() {
Logger.info("Uploading images##");
Http.MultipartFormData body = request().body().asMultipartFormData();
Http.MultipartFormData.FilePart profile = body.getFile("file");
if (profile != null) {
File file = profile.getFile();
//upload file to a directory
//todo
//get the username from form
Map<String,String[]> dataPart = request().body().asMultipartFormData().asFormUrlEncoded();
String username = dataPart.get("username")[0];
//save/update the details with ebean
return ok("File uploaded");
} else {
return status(400, "Missing file");
}
}