Java 使用extjs 4 spring上传图像文件
论坛成员:我在ExtJS4和JAVA中上传文件时遇到了一些问题 我使用的是extjs4,上传表单代码是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,
{
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的答案(内容类型部分)在