У меня возникли проблемы с загрузкой 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
}
}
Спасибо,
Спасибо за твой ответ. Но, похоже, я не могу найти метод bodyAsBytes, связанный/применимый к ответу ws. Я пропускаю какие-либо импорт или ... используя 2.3.8 btw – mane
Не могли бы вы проверить мое обновление, мельницу. Спасибо, – mane
Спасибо за помощь @millhouse! Если вы хотите поблагодарить футболку от Twilio, отправьте электронное письмо на [email protected] –