【问题标题】:image file upload with extjs 4 spring使用 extjs 4 spring 上传图像文件
【发布时间】:2012-03-20 12:55:01
【问题描述】:

论坛成员我在 extjs 4 和 JAVA 中上传文件时遇到了一些问题。

我用的是extjs4,上传表单代码是

{
                                    xtype: 'filefield',
                                    margin: '10 0 0 5',
                                    width: 296,
                                    fieldLabel: 'Image',
                                    emptyText: 'Select Company logo...',
                                    id: 'cmplogo',
                                    itemId: 'cmplogo',
                                    name: 'cmplogo',
                                    labelWidth: 70
                                },
                                {
                                    xtype: 'button',
                                    margin: '10 0 0 90',
                                    width: 89,
                                    text: 'Upload Image',
                                    action: 'btn-upload-img'
                                },

按钮上传图片有action:'btn-upload-img',函数定义如下

fileUpload: function(btn) {
        var win = btn.up('window');
        var form = win.down('form').getForm();
        alert('VALUE IS :'+form.getValues());

        if(form.isValid()){
            form.submit({
                url : 'company/UploadFile.action',
                waitMsg: 'Uploading your file...',
                success: function(fp, o) {
                    Ext.Msg.alert('Success', 'Your file has been uploaded.');
                }
            });
        }
    },

我的java控制器有以下功能代码

@RequestMapping(value = "/company/UploadFile.action")
    public @ResponseBody
    Map<String, ? extends Object> uploadFile(UploadItem uploadItem, BindingResult result) throws Exception {
        System.out.println("QUERY TO UPLOAD FILE");
        try {
            if(result.hasErrors()) {
                for(ObjectError error: result.getAllErrors()) {
                    System.err.println("Error: "+error.getCode()+" - "+error.getDefaultMessage());
                }
            }
            else
            {
                MultipartFile file = uploadItem.getFileData();
                String fileName = null;
                InputStream inputStream = null;
                OutputStream outputStream = null;
                if(file.getSize() > 0) {
                    inputStream = file.getInputStream();
                    if(file.getSize() > 10000) {
                        System.out.println("FILE SIZE:::"+file.getSize());
                    }
                    System.out.println("SIZE ::"+file.getSize());
                    fileName = "E:\\images\\"+file.getOriginalFilename();
                    outputStream = new FileOutputStream(fileName);
                    System.out.println("FILE NAME AND PATH IS ::"+fileName);
                    System.out.println("FILENNAME ::"+file.getOriginalFilename());

                    int readBytes = 0;
                    byte[] buffer = new byte[10000];
                    while((readBytes = inputStream.read(buffer, 0, 10000)) !=-1) {
                        outputStream.write(buffer, 0, readBytes);
                    }
                    outputStream.close();
                    inputStream.close();
                }
            }


        } catch (Exception e) {
            return getModelMapError("Error trying to read city");
        }
        return null;
    }

不知道我上面的代码有什么问题。 我的萤火虫控制台给了我以下错误

**uncaught exception: You're trying to decode an invalid JSON String: <pre>{"message":"Error trying to read city","success":false}</pre>**

请给我一些解决方案,我可以尝试尽快解决我的错误。

【问题讨论】:

  • 您能找到适合您情况的解决方案吗?

标签: java spring extjs4 extjs-mvc


【解决方案1】:

您的控制器发送 JSON 数据(应用程序/json)作为 extjs 不支持的响应。 尝试设置您的响应内容类型:“text/html”,它会正常工作。 将@ResponseBody 更改为 ResponseEntity

@RequestMapping(value = "/company/UploadFile.action")
public ResponseEntity<String> Map<String, ? extends Object> uploadFile(UploadItem uploadItem, BindingResult result) throws Exception {
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Content-Type", "text/html; charset=utf-8");

    // your controller logic goes here

    return new ResponseEntity<String>(response, responseHeaders, HttpStatus.OK);
}

【讨论】:

  • 我在不同的服务器(Pyramid 使用的粘贴服务器)上遇到了同样的问题,digz6666 的答案(内容类型部分)在sencha.com/forum/…得到确认(并进一步解释)
【解决方案2】:

如果您想使用 Spring 上传除 extjs 4 之外的文件,您可以使用带有 multipartData 的 RestTemplate 或 Apache HttpClient。 Spring 还提供了内置工具来上传文件。

有用的链接 -

http://blog.springsource.org/2009/03/27/rest-in-spring-3-resttemplate/

【讨论】:

  • 我可以上传图片,但不知道为什么我的 Image xtype 无法显示图片上传。使用萤火虫,我可以看到图像已上传并完美读取。但是为什么它不显示对我来说是个大问题
  • 您能否将文件保存在“E:\\images\\YOUR_FILE_NAME”中?
  • 是的,我可以在上传到图片文件夹中的 E: 目录后保存我的图片
  • 据我所知,在您的控制器类中引发了异常,即为什么“尝试读取城市时出错”消息显示在萤火虫控制台中。此异常导致将响应发送为 (Success :false)。很可能在您的客户端代码中没有错误处理选项。您可以在您的客户端代码中找到再添加一个关键错误:function() 以获取错误消息。
【解决方案3】:

我遇到了类似的问题。

我将其范围缩小到 ExtJS 试图将响应解码为 JSON。但是响应是用&lt;pre&gt; 标签包裹的。但是,当我查看萤火虫时,我只会看到普通的 json 字符串。由于它是场景浏览器后面的常规multipart 表单帖子,因此以某种方式使用&lt;pre&gt; 标签包装了响应。

不确定如何修改此浏览器行为。

【讨论】:

    【解决方案4】:

    你也可以用"*/*"设置MappingJacksonHttpMessageConverter的supportedMediaTypes属性,就像这样:

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="supportedMediaTypes" value="*/*" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    【讨论】:

      【解决方案5】:

      您在 Java 端的某处抛出异常,该异常返回您在 Firebug 错误中看到的字符串。我建议在 catch 块中添加一个断点并调查异常是什么。这将使您更好地了解损坏的内容以及如何修复它。

      【讨论】:

      • 无法理解这里出了什么问题我刚刚尝试实施loianegroner.com/2011/07/… 教程。但我无法让它工作
      • @CodeChimp:他的响应包含错误不是这里的问题,而是响应在 JavaScript 中没有正确处理(通过 ExtJS)。
      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 2014-02-20
      相关资源
      最近更新 更多