質問

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/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top