質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Scala

    183questions

    ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

  • Play Framework 2

    107questions

    Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Playframework 2.5(Scala) でのコンパイルエラーについて

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,277

__MOX__

score 15

現在Playframework 2.5.3を使ってアプリケーション開発をしているのですが、その際に「PlayでFilenameを読みこみ -> ユーザへ出力」と言った感じの処理をしようとし、コンパイルエラーが出ています。
これは、どうすればよろしいのでしょうか?

環境
 Ubuntu 16.04 LTS
 Scala 2.9.2
 Playframework 2.5.3

コード

package controllers

import javax.inject._
import play.api._
import play.api.mvc._

import java.net.URLDecoder
import java.net.URLEncoder
import java.nio.charset.StandardCharsets

import play.api.mvc.Result
import play.mvc.Http.Request
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node._
import java.io._
import scala.sys.process._
import play.api.libs.iteratee.Enumerator

@Singleton
class main @Inject() extends Controller {

    def download(id: Option[String]) = Action{
        val file = new File("/datadisk/audio.mp3")
        val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file)    

        Result(
            header = ResponseHeader(200, Map(CONTENT_LENGTH -> file.length.toString)),
            body = fileContent
            )
    }
}

エラー内容
type mismatch;  found   : play.api.libs.iteratee.Enumerator[Array[Byte]]  required: play.api.http.HttpEntity

コンパイルエラー

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

まだ僕も2.5をそんなに経験していないのですが、幾つか気になったことがあるので書かせていただきますね。
少しでもお力になれたら幸いです。

まず、scalaは2.9を使われているとのことですが、
play2.5では、scalaは2.11のみをサポートしているはずです。
https://www.playframework.com/documentation/2.5.x/Migration25

それと、エラーはどうやらresultで渡そうとしているデータ型と、
受け取り側で用意している型が異なっているのでエラーになっているようです。
受け取る側(viewsですかね?)のコードを拝見させていただけませんでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 10:53

    scala 2.9 というのは、 おそらく、 Ubuntuにインストール済みでパスが通っているScalaの version が 2.9ということじゃないでしょうか
    activator new でプロジェクトを作成していれば、 build.sbt 内で設定されている scalaVersion は 2.11 になっていると思うので、playの実行時はScala 2.11 が利用されていると思われます。

    キャンセル

0

Playのドキュメントと照らしあわせて見ましたが、Controllerの書き方に問題はなさそうです。

原因かどうかわかりませんが、importの部分が気になりました

import play.api.mvc._
// ...
import play.api.mvc.Result
import play.mvc.Http.Request

まず、 play.api.mvc.Result についてですが、 すでに play.api.mvc._ でmvc パッケージ以下のクラスをまとめてimport しているので、不要なはずです。
たしか、2回import するとimport 対象から外れるような仕様がScalaにあったように思います。

次に、 import play.mvc.Http.Request ですが、こちらはimport play.api.mvc.Http.Requestではないでしょうか?
Scalaのパッケージは play.api 以下にまとまっているので、ここでimportしようとしているのは、PlayJavaのクラスになっているはずです。

この辺りを、修正して試してみていただけますか

play2.0時代の内容ですが、 import なども含めた コントローラ全体の書き方については、以前にこちらにまとめています
http://kuchitama.hateblo.jp/entry/2013/01/11/225612

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

def download(id: Option[String]) = Action{
    val file = new File("/datadisk/audio.mp3")
    val fileContent: Enumerator[Array[Byte]] = Enumerator.fromFile(file)    
    val source = Source.fromPublisher(Streams.enumeratorToPublisher(fileContent)).map(ByteString.apply)
    Ok.sendEntity(HttpEntity.Streamed(source, Some(file.length), Some(contentType)))
}

コンパイルが通るかどうかは未検証ですが、このような形に変更してみてください。
Enumeratorを直接bodyとして持たせるResultを作る形から、
・StreamやEnumeratorなどの配信者(publisher)からSource型を作る
・Source型をくるんだHttpEntityを作る
・HttpEntityをResultに変換する(Ok.sendEntityでResultになります)
という流れになったようです。

公式のドキュメントのマイグレーションガイドとしてはこちらで、
https://www.playframework.com/documentation/2.5.x/StreamsMigration25

次にほぼ回答と同じですが、こちらのStackoverflowと
http://stackoverflow.com/questions/35872352/return-content-from-s3-in-playframework-2-5-scala

こちらのGroupでのやりとりが参考になると思います。
https://groups.google.com/forum/#!topic/play-framework/-cRIcqxOwYU

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Scala

    183questions

    ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

  • Play Framework 2

    107questions

    Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。