playframework を使用して Web サイトを構築しています。また、 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 では問題なく動作します。filedata は null ではなく、正しいデータが含まれています。しかし、クロムまたはファイアフォックスを使用すると、ファイルデータは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)