У меня были проблемы с загрузкой больших файлов на мой сервер Trace.
Я загружаю как Multipart/form-data и извлекаю файл из запроса, используя FileUploadSupport scalatra (как показано ниже)
class foo extends ScalatraServlet with FileUploadSupport {
configureMultipartHandling(MultipartConfig(maxFileSize = Some(1073741824)))
post("/upload") {
//{1}
... //(VALIDATION AND USER LOGIN WITH SCENTRY)
... //(Transactionally posts meta info to Elasticsearch and writes video to filesystem)
}
}
У меня есть батарея тестов, и у меня нет проблем с запуском файлов меньшего размера ~ 50 МБ и даже файлов размером 3-400 МБ, если сервер работает на локальном хосте.
Однако, когда я размещаю свой сервер на удаленной машине, у меня возникают некоторые специфические проблемы с транспортом. И (при отладке) я никогда не достигаю точки останова в {1}
Исследуя проблему, я нашел это, что предполагает повторное использование одного и того же http-соединения, которое может быть причиной проблемы. Следуя их совету, я добавил в свой сервлет следующее, и, проанализировав заголовки ответов, я могу подтвердить, что это «принято»:
before("/*") {
response.addHeader("Connection", "close")
}
Мое исследование также показало некоторые проблемы со слишком большим количеством ключей формы, однако рассматриваемая форма имеет только 4 ключа, и я не вижу проблемы на локальном хосте или с файлами меньшего размера на удаленной машине.
Эта загрузка происходит через https (если это уместно) с сертификатом, подписанным CA, и принимается Google Chrome как безопасное, частное соединение.
При настройке соединителя сервера я изменил значение тайм-аута простоя на случай, если это вызывало какие-либо проблемы.
httpsConnector.setIdleTimeout(300000)
Несмотря на эти модификации, мне еще предстоит решить эту проблему, и я ценю любые ваши советы.
РЕДАКТИРОВАТЬ1-РЕШЕНО-
Я полагал, что уже выделил 4 ГБ пространства кучи, и поэтому это была незначительная ошибка. Оказывается, версия, которую я запускал на локальном хосте, была через Intellij, у которой есть свои представления о размере кучи.
при запуске его на удаленной машине с помощью «sbt run» я забыл включить опцию fork в свой build.scala. следовательно, sbt проигнорировал мои параметры jvm (предположительно, не может установить параметры на работающем jvm), и я работал с кучей 300 МБ.
MultipartConfig
должен указыватьlocation
, чтобы файлы записываются/читаются из этого места на вашем локальном диске (таким образом, не требуется память для хранения всего содержимого файла). - person Joakim Erdfelt   schedule 15.11.2015