さまざまなブラウザを使用して、PlayFrameworkのファイルアップロード
-
27-09-2019 - |
質問
Playframeworkを使用してWebサイトを構築しています。また、名前のリッチエディターも使用しています Xheditor.
Xheditor Support Ajax-Fileuploading、Server側には、アップロードファイルを含む「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を使用する場合、Filedataは ヌル!!
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)
解決
httpリクエストからファイル添付ファイル抽出を管理するplay.data.parsing.apachemultipartparserクラスをご覧ください。
getFieldNameは、ヘッダー「コンテンツディスポジション」と「フォームデータ」を検索するフィールドの名前を取得します。あなたの場合、それは存在しません。
private String getFieldName(Map /* String, String */ headers) {
String fieldName = null;
String cd = getHeader(headers, CONTENT_DISPOSITION);
if (cd != null && cd.toLowerCase().startsWith(FORM_DATA)) {
ParameterParser parser = new ParameterParser();
parser.setLowerCaseNames(true);
// Parameter parser can handle null input
Map params = parser.parse(cd, ';');
fieldName = (String) params.get("name");
if (fieldName != null) {
fieldName = fieldName.trim();
}
}
return fieldName;
}
getFileNameでは、ヘッダー「コンテンツディスポジション」、「フォームダタ」または「添付ファイル」を検索してファイル名を取得します。
private String getFileName(Map /* String, String */ headers) {
String fileName = null;
String cd = getHeader(headers, CONTENT_DISPOSITION);
if (cd != null) {
String cdl = cd.toLowerCase();
if (cdl.startsWith(FORM_DATA) || cdl.startsWith(ATTACHMENT)) {
ParameterParser parser = new ParameterParser();
parser.setLowerCaseNames(true);
// Parameter parser can handle null input
Map params = parser.parse(cd, ';');
if (params.containsKey("filename")) {
fileName = (String) params.get("filename");
if (fileName != null) {
fileName = fileName.trim();
// IE7 returning fullpath name (#300920)
if (fileName.indexOf('\\') != -1) {
fileName = fileName.substring(fileName.lastIndexOf('\\') + 1);
}
} else {
// Even if there is no value, the parameter is present,
// so we return an empty file name rather than no file
// name.
fileName = "";
}
}
}
}
return fileName;
}
したがって、あなたの場合、このコードはフィールド名ではなくファイル名を見つけるので、これがあなたのコントローラーでnullにfiledataフィールドに設定されている理由です。
なぜIE6で動作するのですか? (それは本当に標準ではなく、他の人がもうしないことをするからですか?:))
詳細については、CRUDモジュールでは、FileField.htmlはファイルのアップロードを次のように宣言します。
<input id="${field.id}" class="${field.errorClass}" type="file" name="${field.name}" />
よろしく
他のヒント
サイトをファイルアップローダーと統合してみてください。これには、異なる言語用のドキュメント/サンプルのLOFがありますwww.uploadify.com/