En html, un formulario con los datos:

<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>

Cómo escribir la acción Files upload?

Sé cómo obtener un archivo subido:

request.body.file("file") map {
    filepart => filepart.ref.moveTo(newFile);
}

Y cómo se presentó entradas:

Form(tuple("groupId" -> text, "tagId" -> text)).bindFromRequest.fold(
    errors => ...,
    params => ....
)

Pero, ¿cómo combinarlos?

No me parece un tipo más adecuado para file puede ser utilizado en Form(tuple(...)), y ni una forma de obtener el valor de entrada en request.body.

InformationsquelleAutor Freewind | 2012-02-26

4 Comentarios

  1. 27

    Esta respuesta es para Java, pero usted debe ser capaz de adaptarse a la Scala con bastante facilidad.

    Lo que usted necesita hacer es definir un Modelo para todos los campos de su formulario excepto el archivo. A continuación, utilice el archivo de carga de la API como normal para recuperar el archivo.

    Por ejemplo, esto es lo que hice:

    La Forma (en 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>
    }
    

    El Modelo (models/UploadResource.java):

    public class UploadResource {
        @Required
        public String lang;
    
        @Required
        public String country;
    
        /* notice a field for the file is missing */
    }
    

    El Controlador de (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 */
         }
    }
    

    Espero que esto ayude.

    • Lo que si desea almacenar la ubicación del archivo en el modelo? De lo contrario, ¿cómo sabrás donde está ubicado el archivo después de procesarlo? Supongo que me falta, por lo que la «carga de archivos de la API» es – commons.apache.org/proper/commons-fileupload/using.html ?
    • este código sólo permite obtener el formulario de datos y el archivo. Una vez que tenemos el archivo (el resourceFile en mi ejemplo), se puede mover a cualquier lugar donde desea guardarla, y de actualización de su modelo con la ubicación y nombre de archivo.
  2. 13

    Un ejemplo en la Scala, donde el campo de formulario se requiere:

    Modelo:

    case class Specs (userid: String)
    

    Controlador:

    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.")
          }
       }
    }
    
  3. 3

    Otro ejemplo de cómo hacer esto puede ser este:

    Modelo:

    case class Specs(userId: String)
    

    Controlador de

    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)
          }
       }
    
    
     )
    

    No olvides el nombre del archivo, ya que podría terminar preguntándose qué salió mal.

  4. 2

    Me estaba cargando un archivo mediante angulares, con otros parámetros de formulario. He creado la mía como la de abajo y funciona.

    Angular De La Función De

    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);
    });
    

    Jugar 2.1 Controlador

    /**
    *
    *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");
        }
    }
    

Dejar respuesta

Please enter your comment!
Please enter your name here