Writing a test case for file uploads in Play 2.1 and Scala

后端 未结 7 1815
猫巷女王i
猫巷女王i 2021-01-02 05:39

I found the following question/answer:

Test MultipartFormData in Play 2.0 FakeRequest

But it seems things have changed in Play 2.1. I\'ve tried adapting the

7条回答
  •  被撕碎了的回忆
    2021-01-02 05:59

    I've modified Alex's code to act as a Writable which better integrates into Play 2.2.2

    package test
    
    import play.api.http._
    import play.api.mvc.MultipartFormData.FilePart
    import play.api.libs.iteratee._
    import play.api.libs.Files.TemporaryFile
    import play.api.mvc.{Codec, MultipartFormData }
    import java.io.{FileInputStream, ByteArrayOutputStream}
    import org.apache.commons.io.IOUtils
    import org.apache.http.entity.mime.MultipartEntity
    import org.apache.http.entity.mime.content._
    
    object MultipartWriteable {
    
      /**
       * `Writeable` for multipart/form-data.
       *
       */
      implicit def writeableOf_multiPartFormData(implicit codec: Codec): Writeable[MultipartFormData[TemporaryFile]] = {
    
        val entity = new MultipartEntity()
    
        def transform(multipart: MultipartFormData[TemporaryFile]):Array[Byte] = {
    
          multipart.dataParts.foreach { part =>
            part._2.foreach { p2 =>
                entity.addPart(part._1, new StringBody(p2))
            }
          }
    
          multipart.files.foreach { file =>
            val part = new FileBody(file.ref.file, file.filename,     file.contentType.getOrElse("application/octet-stream"), null)
            entity.addPart(file.key, part)
          }
    
          val outputStream = new ByteArrayOutputStream
          entity.writeTo(outputStream)
          val bytes = outputStream.toByteArray
          outputStream.close
          bytes
        }
    
        new Writeable[MultipartFormData[TemporaryFile]](transform, Some(entity.getContentType.getValue))
      }
    }
    

    This way it is possible to write something like this:

    val filePart:MultipartFormData.FilePart[TemporaryFile] = MultipartFormData.FilePart(...)
    val fileParts:Seq[MultipartFormData.FilePart[TemporaryFile]] = Seq(filePart)
    val dataParts:Map[String, Seq[String]] = ...
    val multipart = new MultipartFormData[TemporaryFile](dataParts, fileParts, List(), List())
    val request = FakeRequest(POST, "/url", FakeHeaders(), multipart)
    
    var result = route(request).get
    

提交回复
热议问题