我正在使用 playframework 来构建一个网站。而且我还使用了一个名为xheditor的富编辑器。
Xheditor 支持 ajax-fileuploading,它需要服务器端有一个动作,它接受包含上传文件的“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,则文件数据为空!
我用firebug来监控firebug提交了什么,发现它提交了这样一个header:
content-disposition
attachment; name="filedata"; filename="051111twdns.zip"
我认为 play 没有正确处理这种情况,所以参数“filedata”为空。
为了使用 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”方法会报“Read Error!”,甚至下面的代码也会报这样的错误:
request.body.available()
request.body.read()
request.body.read(bytes)