Java 使用extjs 4 spring上传图像文件

Java 使用extjs 4 spring上传图像文件,java,spring,extjs4,extjs-mvc,Java,Spring,Extjs4,Extjs Mvc,论坛成员:我在ExtJS4和JAVA中上传文件时遇到了一些问题 我使用的是extjs4,上传表单代码是 { xtype: 'filefield', margin: '10 0 0 5', width: 296,

论坛成员:我在ExtJS4和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'
                                },
按钮上载图像具有操作:“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;
    }
@RequestMapping(value=“/company/UploadFile.action”)
公共@ResponseBody
映射上载文件(UploadItem UploadItem,BindingResult)引发异常{
System.out.println(“查询上传文件”);
试一试{
if(result.hasErrors()){
for(ObjectError错误:result.getAllErrors()){
System.err.println(“错误:“+Error.getCode()+”-“+Error.getDefaultMessage());
}
}
其他的
{
MultipartFile file=uploadItem.getFileData();
字符串文件名=null;
InputStream InputStream=null;
OutputStream OutputStream=null;
如果(file.getSize()>0){
inputStream=file.getInputStream();
如果(file.getSize()>10000){
System.out.println(“文件大小::”+FILE.getSize());
}
System.out.println(“大小::”+file.getSize());
fileName=“E:\\images\\”+file.getOriginalFilename();
outputStream=新文件outputStream(文件名);
System.out.println(“文件名和路径为::”+文件名);
System.out.println(“FILENNAME::”+file.getOriginalFilename());
int readBytes=0;
字节[]缓冲区=新字节[10000];
而((readBytes=inputStream.read(缓冲区,0,10000))!=-1){
写入(缓冲区,0,读取字节);
}
outputStream.close();
inputStream.close();
}
}
}捕获(例外e){
返回getModelMapError(“尝试读取城市时出错”);
}
返回null;
}
不知道我上面的代码出了什么问题我的firebug控制台显示以下错误

**uncaught exception: You're trying to decode an invalid JSON String: <pre>{"message":"Error trying to read city","success":false}</pre>**
**未捕获异常:您试图解码无效的JSON字符串:{“message”:“尝试读取城市时出错”,“success”:false}**
@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);
}

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

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

有用链接-


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

我遇到了类似的问题

我把范围缩小到ExtJS,试图将响应解码为JSON。但是响应是用
标记包装的。然而,当我查看firebug时,我只看到了简单的json字符串。由于它是一个常规的
多部分
表单post,因此在场景浏览器后面以某种方式用
标记包装响应

<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>

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

您的控制器将JSON数据(应用程序/JSON)作为响应发送,而extjs不支持此响应。 尝试设置您的响应内容类型:“text/html”,这样就可以了。 将@ResponseBody更改为ResponseEntity

@RequestMapping(value=“/company/UploadFile.action”)
公共响应属性映射上载文件(UploadItem UploadItem,BindingResult)引发异常{
HttpHeaders responseHeaders=新的HttpHeaders();
add(“内容类型”,“text/html;charset=utf-8”);
//你的控制器逻辑在这里
返回新的ResponseEntity(response,responseHeaders,HttpStatus.OK);
}

您还可以使用
“*/*”
设置MappingJacksonHttpMessageConverter的supportedMediaTypes属性,如下所示:



我无法理解这里出了什么问题,我刚刚尝试实施教程。但我没能做到working@CodeChimp:他的响应包含错误这一事实并不是问题所在,而是JavaScript(通过ExtJS)没有正确处理响应。我可以上传图像,但不知道为什么我的图像xtype无法显示图像上传。有了firebug,我可以看到图像上传和阅读都非常完美。但为什么它不显示对meDid来说是一个大问题?您可以将文件保存在“E:\\images\\YOUR_file_NAME”中?是的,我可以在上传到E:目录后将图像保存在images文件夹中。正如我在您的控制器类中所理解的那样,引发了一个异常,即为什么firebug控制台中显示“尝试读取城市时出错”消息。此异常导致以(成功:false)的形式发送响应。很可能在客户端代码中没有错误处理选项。您可以在客户端代码中找到另一个关键错误:function(),以获取错误消息。您是否能够找到解决方案?我在不同的服务器(金字塔使用的粘贴服务器)上遇到了相同的问题,digz6666的答案(内容类型部分)在