Skip to content

Commit f7e7122

Browse files
committed
Add media type detection and bump versions
1 parent 5ccc372 commit f7e7122

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ libraryDependencies ++= Seq(
114114
"com.github.blemale" %% "scaffeine" % "5.3.0",
115115
"ch.qos.logback" % "logback-classic" % "1.4.12",
116116

117+
"org.apache.tika" % "tika-core" % "2.9.2",
118+
117119
"org.testcontainers" % "testcontainers" % testContainersVersion,
118120
"org.testcontainers" % "elasticsearch" % testContainersVersion,
119121
"org.testcontainers" % "rabbitmq" % testContainersVersion,

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.10.3
1+
sbt.version=1.10.5

src/main/scala/alpakka/file/uploader/Uploader.scala

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.apache.pekko.http.scaladsl.server.Route
1010
import org.apache.pekko.http.scaladsl.server.directives.FileInfo
1111
import org.apache.pekko.http.scaladsl.settings.ConnectionPoolSettings
1212
import org.apache.pekko.stream.scaladsl.FileIO
13+
import org.apache.tika.Tika
1314
import org.slf4j.{Logger, LoggerFactory}
1415

1516
import java.io.File
@@ -102,22 +103,24 @@ class Uploader(system: ActorSystem) {
102103
result
103104
}
104105

106+
def detectMediaType(file: File): ContentType = {
107+
val tika = new Tika()
108+
val detectedMediaType = tika.detect(file)
109+
logger.info(s"Detected media type: $detectedMediaType")
110+
111+
ContentType.parse(detectedMediaType) match {
112+
case Right(contentType) => contentType
113+
case Left(_) => ContentTypes.`application/octet-stream`
114+
}
115+
}
116+
105117
private def createEntityFrom(file: File): Future[RequestEntity] = {
106118
require(file.exists())
107119
val fileSource = FileIO.fromPath(file.toPath, chunkSize = 1000000)
108120

109-
// akka-http server is easy regarding the MediaType
110-
// Other HTTP servers need an explicit MediaType, to be able to process the multipart POST request
111-
// val paramMapFile = Map("type" -> "text/csv", "filename" -> file.getName)
112-
//
113-
// val formData = Multipart.FormData(Multipart.FormData.BodyPart(
114-
// "uploadedFile",
115-
// //HttpEntity(MediaTypes.`multipart/form-data`, file.length(), fileSource), paramMapFile))
116-
// HttpEntity(MediaTypes.`text/csv`.toContentType(HttpCharset.apply("UTF-8")(Seq.empty)), file.length(), fileSource), paramMapFile))
117-
118121
val formData = Multipart.FormData(Multipart.FormData.BodyPart(
119122
"uploadedFile",
120-
HttpEntity(MediaTypes.`application/octet-stream`, file.length(), fileSource),
123+
HttpEntity(detectMediaType(file), file.length(), fileSource),
121124
Map("filename" -> file.getName)))
122125
Marshal(formData).to[RequestEntity]
123126
}

0 commit comments

Comments
 (0)