2014-03-26 47 views
-1

我有一个方法将图像文件保存在数据库中作为BLOB文件。该方法工作正常,但当我在ExtJS filefield组件中得到回调时,它总是经历失败函数,我不知道我必须通过成功函数做出回应,这是我的代码:与泽西岛和ExtJS文件上传的响应

服务器方法:

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces({ MediaType.APPLICATION_JSON }) 
public ServiceResponse uploadFile(@QueryParam("id") Long iconId, FormDataMultiPart form) { 
    CatIcon icon; 
    if (iconId != null) { 
     icon = catIconBean.getOne(iconId); 
    } else { 
     icon = new CatIcon(); 
    } 

    byte[] image = form.getField("iconBmp").getValueAs(byte[].class); 
    if (image.length != 0) { 
     MultivaluedMap<String, String> headers = form.getField("iconBmp").getHeaders(); 
     String type = headers.getFirst("Content-type"); 
     List<String> list = Arrays.asList("image/gif", "image/png", "image/jpg", "image/jpeg", 
       "image/x-icon", "image/bmp"); 
     if (list.contains(type)) { 
      icon.setIconBmp(image); 
      icon.setType(type); 
     } 
    } 

    icon.setDescription(form.getField("description").getValue()); 
    icon.setFileName(form.getField("fileName").getValue()); 
    icon = catIconBean.saveIcon(icon); 

    ServiceResponse sr = new ServiceResponse(); 
    sr.httpResponse = true; 
    return sr; 
} 

我必须返回上面的代码?

客户:

uploadIcon : function(item, e, eOpts) { 
    var me = this; 
    var form = this.getDetail().getForm(); 
    var valid = form.isValid(); 
    if (!valid) { 
     return false; 
    } 
    var values = form.getValues(); 
    if(values) { 
     form.submit({ 
      url : myApplication.defaultHost() + 'icon/upload?id=' + values.id, 
      waitMsg : 'Uploading...', 
      success : function(form, action) { 
       me.onCompleteSaveOrDelete(); 
      }, 
      failure : function(form, action) { 
       me.onCompleteSaveOrDelete(); 
      } 
     }); 
    } 
}, 

我写相同的功能,me.onCompleteSaveOrDelete(),在这两个回调函数,使其被称为,这是我想成功要调用的方法。

问候。

UPDATE:

我做了几乎相同的回答Alexander.Berg。唯一的区别是我写@Produces({ MediaType.APPLICATION_JSON })而不是@Produces({ MediaType.TEXT_HTML }),因为我需要Json响应。但是,当我在Chrome中调试和检查响应,我得到这个:

在失败:

failure : function(form, action) { 
    me.onCompleteSaveOrDelete(); 
} 

在行动PARAM,内responseText

"{"data":"{\"success\":true}","httpResponse":true,"totalCount":0}" 

但它仍然通过failure去。 ..我觉得我很亲密,任何帮助?

问候。

+0

你能否看看我的回答是否帮助你? –

+0

嗨@ Alexander.Berg,你的回答非常有帮助,它确实帮了我,但它不能正常工作,它仍然抛出未找到MIME媒体类型文本/ html。任何想法? – Alavaros

+0

嗨@Alavaros,也许下面的链接可以帮助你:[未找到MIME媒体类型文本/ html](http://stackoverflow.com/questions/8645674/a-message-body-writer-for-java- class-and-mime-media-type-text-html-was-not-f) –

回答

1

Extjs中的fileupload比较棘手,因为它使用的是iframe并提交,而不是真正的上传文件的ajax请求。

请尝试对服务器方法:

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.TEXT_HTML) 
public String uploadFile(@QueryParam("id") Long iconId, FormDataMultiPart form) { 
    (...) 
    JSONObject json = new JSONObject(); 
    json.put("success", true); 
    json.put("msg", "Success"); 
    return json.toString(); 
}

这是因为上传接受内容类型text/html,

见例在http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.form.field.File - >使用示例 - >实时预览

使用带有Firebug插件的Firefox浏览器并在Net选项卡中输入以下URL - >http://docs.sencha.com/extjs/4.2.2/photo-upload.php

Response Headersview source 
(...) 
Content-Type text/html 
(...) 

Request Headersview source 
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
(...)
+0

嗨!感谢您的回答。我有一个问题,为什么你将响应写为'MediaType.TEXT_HTML'?为什么不用'MediaType.APPLICATION_JSON'?问候。 – Alavaros

+0

用解释修改了答案 –