Я использую playframework для создания веб-сайта. А еще я использую богатый редактор под названием xheditor .
Xheditor поддерживает загрузку ajax-файлов, ему необходимо, чтобы на стороне сервера было действие, которое принимает параметр "filedata", содержащий загружаемый файл.
Итак, я написал действие загрузки:
public class Application extends Controller {
public static void upload(File filedata) {
// the filedata should not be null
renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}");
}
}
Оно отлично работает в IE6, filedata не является нулевым и содержит правильные данные. Но, если я использую chrome или firefox, данные файла будут null !!
Я использую firebug, чтобы отслеживать, что отправляет firebug, и обнаружил, что он отправляет такой заголовок:
content-disposition
attachment; name="filedata"; filename="051111twdns.zip"
Я думаю, что play не обработайте этот случай правильно, поэтому параметр "filedata" имеет значение null.
Для работы с chrome и firefox я изменил это действие:
public class Application extends Controller {
public static void upload(File filedata) {
if(filedata!=null) {
// ok, it's IE6
renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}");
} else {
// it's chrome or firefox, the data is in request.body
File targetFile = new File("upload/test.zip");
IOUtils.copy(request.body, new FileOutputStream(targetFile));
}
}
}
Теперь это работает в IE6, chrome и firefox, НО , только если загружаемый файл очень маленький. Например, меньше 4K. Если он немного больше, например 12K, метод «IOUtils.copy» сообщит «Ошибка чтения!», даже следующий код сообщит о такой ошибке:
request.body.available()
request.body.read()
request.body.read(bytes)