我使用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,所述FILEDATA不为空,并且包含正确的数据。但是,如果使用铬或Firefox,所述FILEDATA是的 !!

我用萤火监视萤火虫提交什么,并发现它提交这样的报头:

content-disposition
attachment; name="filedata"; filename="051111twdns.zip"

我觉得该剧没有正确处理这种情况下,这样的参数“FILEDATA”是空的。

为了用铬和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)
有帮助吗?

解决方案

您应该看看play.data.parsing.ApacheMultipartParser类,其管理从HTTP请求中的文件附件萃取。

在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;
}

因此很明显,你的情况,该代码会发现文件名,但不是字段名称,所以也许这就是为什么你有你的FILEDATA字段设置为空在控制器中。

为什么它与IE6的工作吗? (因为它从来没有真正的标准,做了别人不办了??? :))

有关的信息,渣滓模块中,所述fileField.html声明文件上传如下:

<input id="${field.id}" class="${field.errorClass}" type="file" name="${field.name}" />

问候

其他提示

尝试用文件上传,其中有文件的LOF为不同势语言/样品整合您的网站 www.uploadify.com /

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top