java 中的自定义 ckeditor fileUpload 和 apache fileUpload parseRequest returns 空列表
Custom ckeditor fileUpload in java with apache fileUpload parseRequest returns empty list
我有一个 seam 2.2.2 应用程序,我正在尝试为其定制 ckeditor fileUpload 插件。
我想出的解决方案是:
1) 为具有 'editor' 样式的所有元素初始化编辑器 class:
var elements = CKEDITOR.document.find('.editor');
for(var i = 0; i< elements["$"].length; i++){
CKEDITOR.replace(elements["$"][i], {
filebrowserUploadUrl: rootPath + "/cops/filebrowserUploadUrl.seam"
});
}
2) 设置filebrowserUploadUrl.seam,只执行:
#{attachmentController.sendImageToServer()}
3) 使用apache commons fileUpload实现后端:
public void sendImageToServer()
{
HttpServletRequest request = ServletContexts.instance().getRequest();
DiskFileItemFactory factory = new DiskFileItemFactory();
File repository = (File) request.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
try
{
List<FileItem> items = upload.parseRequest(request);
processItems(items); //set the file data to specific att
saveOpenAttachment(); //save the file to disk
}
这个方法调用没问题。我可以在请求中调试上传参数(带有一些二进制数据),但 upload.parseRequest(request) returns 是一个空列表。我搜索了这个问题并做了我能做的一切,但我无法判断是否应用程序自定义 FaceletViewHandler 导致了这个问题。
虽然如果我能找到这个问题的解决方案我会非常满意,但我觉得这不是一个好的解决方案。也许 Seam 与 facelets 的集成可以给我一个更好的解决方案。我真的不知道。
有什么建议吗?
最终解决方案类似于 Seam 多部分过滤器处理请求:
ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
try
{
if (!(request instanceof MultipartRequest))
{
request = unwrapMultipartRequest(request);
}
if (request instanceof MultipartRequest)
{
MultipartRequest multipartRequest = (MultipartRequest) request;
String clientId = "upload";
setFileData(multipartRequest.getFileBytes(clientId));
setFileContentType(multipartRequest.getFileContentType(clientId));
setFileName(multipartRequest.getFileName(clientId));
saveOpenAttachment();
}
}
现在我像 Seam 一样处理请求,不需要破坏其他类型请求的 web:multipart-filter 配置。
我有一个 seam 2.2.2 应用程序,我正在尝试为其定制 ckeditor fileUpload 插件。
我想出的解决方案是:
1) 为具有 'editor' 样式的所有元素初始化编辑器 class:
var elements = CKEDITOR.document.find('.editor');
for(var i = 0; i< elements["$"].length; i++){
CKEDITOR.replace(elements["$"][i], {
filebrowserUploadUrl: rootPath + "/cops/filebrowserUploadUrl.seam"
});
}
2) 设置filebrowserUploadUrl.seam,只执行:
#{attachmentController.sendImageToServer()}
3) 使用apache commons fileUpload实现后端:
public void sendImageToServer()
{
HttpServletRequest request = ServletContexts.instance().getRequest();
DiskFileItemFactory factory = new DiskFileItemFactory();
File repository = (File) request.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
try
{
List<FileItem> items = upload.parseRequest(request);
processItems(items); //set the file data to specific att
saveOpenAttachment(); //save the file to disk
}
这个方法调用没问题。我可以在请求中调试上传参数(带有一些二进制数据),但 upload.parseRequest(request) returns 是一个空列表。我搜索了这个问题并做了我能做的一切,但我无法判断是否应用程序自定义 FaceletViewHandler 导致了这个问题。 虽然如果我能找到这个问题的解决方案我会非常满意,但我觉得这不是一个好的解决方案。也许 Seam 与 facelets 的集成可以给我一个更好的解决方案。我真的不知道。 有什么建议吗?
最终解决方案类似于 Seam 多部分过滤器处理请求:
ServletRequest request = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
try
{
if (!(request instanceof MultipartRequest))
{
request = unwrapMultipartRequest(request);
}
if (request instanceof MultipartRequest)
{
MultipartRequest multipartRequest = (MultipartRequest) request;
String clientId = "upload";
setFileData(multipartRequest.getFileBytes(clientId));
setFileContentType(multipartRequest.getFileContentType(clientId));
setFileName(multipartRequest.getFileName(clientId));
saveOpenAttachment();
}
}
现在我像 Seam 一样处理请求,不需要破坏其他类型请求的 web:multipart-filter 配置。