2016-05-07 1 views
1

У меня возникли проблемы с загрузкой media from the media uri, представленной на сообщениях mms.Загрузите файл мультимедиа из twilio, используя носитель URI

val url = https://api.twilio.com/2010-04-01/Accounts/xx/Messages/xx/Media/xx 

URL-адрес СМИ обеспечивалось в приведенной выше структуре,

new URL(url) #> new File("file.png") !! //this fails, due to multiple redirects 

Когда я открываю URI в браузере редирект заканчивается в

http://media.twiliocdn.com.s3-external-1.amazonaws.com/xx/xx 

первый URL -> 2 url -> выше url, так что все в целом 2 перенаправления

И если я попробую отсканированный выше текст с новым URL-адресом, он работает. Я уверен, что из-за множественных переадресаций этот фрагмент не работал в первую очередь.

Использует рамки игр с Скале, могу ли я получить какой-либо пример источника для загрузки файла. Любую помощь или указатели оценивают. Пробовал различные примеры, но все еще не мог решить проблему.

Некоторые выводы => Accessing Twilio MMS images

ничего похожего на Скале?

Update: @millhouse

def fileDownloader(urls: String, location: String) = { 

    import play.api.Play.current 
    import scala.concurrent.ExecutionContext.Implicits.global 

    // Make the request 
    val futureResponse: Future[(WSResponseHeaders, Enumerator[Array[Byte]])] = 
     WS.url(urls).withFollowRedirects(true).getStream() 

    futureResponse.flatMap { 
     case (headers, body) => 
     val file = new File(location) 
     val outputStream = new FileOutputStream(file) 

     // The iteratee that writes to the output stream 
     val iteratee = Iteratee.foreach[Array[Byte]] { bytes => 
      outputStream.write(bytes) 
     } 

     // Feed the body into the iteratee 
     (body |>>> iteratee).andThen { 
      case result => 
      // Close the output stream whether there was an error or not 
      outputStream.close() 
      // Get the result or rethrow the error 
      result.get 
     }.map(_ => file) 
    } 
    } 

Это подход, который я использовал до сих пор (работ), как описано в стыковых документации. Но мне нужен был подход sync, то есть мне нужно было бы выполнить еще один шагпри успешном скачивании файла. Извините, за то, что я не уточнил.

Update 2: решаемые таким образом,

 def fileDownloader(urls: String, location: String) = { 

        import play.api.Play.current 
        import scala.concurrent.ExecutionContext.Implicits.global 

        // Make the request 
        val futureResponse: Future[(WSResponseHeaders, Enumerator[Array[Byte]])] = 
         WS.url(urls).withFollowRedirects(true).getStream() 

        val downloadedFile: Future[File] = futureResponse.flatMap { 
         case (headers, body) => 
         val file = new File(location) 
         val outputStream = new FileOutputStream(file) 

         // The iteratee that writes to the output stream 
         val iteratee = Iteratee.foreach[Array[Byte]] { bytes => 
          outputStream.write(bytes) 
         } 

         // Feed the body into the iteratee 
         (body |>>> iteratee).andThen { 
          case result => 
          // Close the output stream whether there was an error or not 
          outputStream.close() 
          // Get the result or rethrow the error 
          result.get 
         }.map(_ => file) 
        } 
    downloadedFile.map{ fileIn => 
       //things needed to do 
} 
        } 

Спасибо,

ответ

2

Я не использовал API Twilio MMS, но это должно быть очень просто, чтобы получить клиент Play Framework HTTP следовать редиректов , с помощью documented option к клиенту:

val url = "https://api.twilio.com/2010-04-01/Accounts/xx/Messages/xx/Media/xx" 

ws.url(url).withFollowRedirects(true).get().map { response => 
    val theBytes:Array[Byte] = response.bodyAsBytes // Play 2.4 and lower 
    // ... save it 
} 

Обратите внимание, что приведенный выше код работает для воспроизведения 2.4.x и ниже; the bodyAsBytes method of WSResponse returns an Array[Byte]. Если вы находитесь на текущей режущей кромки и с помощью Play 2.5.x, bodyAsBytes дает вам Akka ByteString с большим количеством хороших функциональных методов, но вы, вероятно, просто хотите позвонить toArray на ней, если все, что вы хотите, чтобы хранить данные:

ws.url(url).withFollowRedirects(true).get().map { response => 
    val theBytes:Array[Byte] = response.bodyAsBytes.toArray // Play 2.5 
    // ... save it 
} 
+0

Спасибо за твой ответ. Но, похоже, я не могу найти метод bodyAsBytes, связанный/применимый к ответу ws. Я пропускаю какие-либо импорт или ... используя 2.3.8 btw – mane

+0

Не могли бы вы проверить мое обновление, мельницу. Спасибо, – mane

+1

Спасибо за помощь @millhouse! Если вы хотите поблагодарить футболку от Twilio, отправьте электронное письмо на [email protected] –

 Смежные вопросы

  • Нет связанных вопросов^_^