Я использую 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 работает нормально, данные файла не равны нулю и содержат правильные данные.Но, если я использую 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.Если он немного больше, например, 12 КБ, метод «IOUtils.copy» сообщит «Ошибка чтения!», Даже следующий код сообщит о такой ошибке:
request.body.available()
request.body.read()
request.body.read(bytes)