在一个文件上传的方法中,使用ImageIO.read( );方法,程序就停止,try catch也不报错,求大神~求解决思路,,,代码如下:@RequestMapping("/shareUpload.do")
@ResponseBody
public String shareUpload(String content,Long uid,MultipartHttpServletRequest request){
try {
content = URLDecoder.decode(content, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
MultipartFile file = request.getFile("file1");
if (!file.isEmpty()){
try {
String path = request.getSession().getServletContext().getRealPath("share");
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
String fn = UUID.randomUUID().toString();
fileName = fn+suffix;
//FileUploadUtils.copyFile(file.getInputStream(), fileName,path);
saveFile(file, path+File.separator+fileName);
Share s = new Share();
s.setUsImg(fileName);
s.setUsContent(content);
s.setUsUid(uid);
shareService.save(s);
User u = userService.findById(uid);
u.setUShareNum(u.getUShareNum()+1);
userService.update(u);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
protected boolean saveFile(MultipartFile file,String path){
InputStream fileIS=null;
FileOutputStream fileOS=null;
try{
fileIS=file.getInputStream();
fileOS=new FileOutputStream(path);
//fileOS.write(file.getBytes());
//1024*4=4096 上传文件最小可能有几K,最大有几M,根据情况考虑用4K缓冲区
byte[] bytes = new byte[4096];
int c;
while ((c = fileIS.read(bytes)) != -1) {
fileOS.write(bytes, 0, c);
}
ImageIO.read(fileIS);//<---------程序执行到这里时,debug就停止,不执行下一行
System.out.println(1);
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try{
if(null!=fileIS)fileIS.close();
if(null!=fileOS)fileOS.close();
}catch(Exception e){
e.printStackTrace();
return false;
}
}
return true;
}
读取的这个文件大小只有100多K,格式为.jpg
@ResponseBody
public String shareUpload(String content,Long uid,MultipartHttpServletRequest request){
try {
content = URLDecoder.decode(content, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
MultipartFile file = request.getFile("file1");
if (!file.isEmpty()){
try {
String path = request.getSession().getServletContext().getRealPath("share");
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
String fn = UUID.randomUUID().toString();
fileName = fn+suffix;
//FileUploadUtils.copyFile(file.getInputStream(), fileName,path);
saveFile(file, path+File.separator+fileName);
Share s = new Share();
s.setUsImg(fileName);
s.setUsContent(content);
s.setUsUid(uid);
shareService.save(s);
User u = userService.findById(uid);
u.setUShareNum(u.getUShareNum()+1);
userService.update(u);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
protected boolean saveFile(MultipartFile file,String path){
InputStream fileIS=null;
FileOutputStream fileOS=null;
try{
fileIS=file.getInputStream();
fileOS=new FileOutputStream(path);
//fileOS.write(file.getBytes());
//1024*4=4096 上传文件最小可能有几K,最大有几M,根据情况考虑用4K缓冲区
byte[] bytes = new byte[4096];
int c;
while ((c = fileIS.read(bytes)) != -1) {
fileOS.write(bytes, 0, c);
}
ImageIO.read(fileIS);//<---------程序执行到这里时,debug就停止,不执行下一行
System.out.println(1);
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try{
if(null!=fileIS)fileIS.close();
if(null!=fileOS)fileOS.close();
}catch(Exception e){
e.printStackTrace();
return false;
}
}
return true;
}
读取的这个文件大小只有100多K,格式为.jpg
但是我发现一个问题 ,不知道是不是引起阻塞的原因。 你按照下面的方法试试。
在 ImageIO.read(fileIS); 这句代码之前,你已经将fileIS的内容全部读完了。 你这里再用ImageIO.read去读取,肯定是取不到数据的。你已经将所有的内容都写入到new FileOutputStream(path);这个输入流了。所以,你的ImageIO可以从文件读 。
将ImageIO.read(fileIS); 替换成 ImageIO.read(new File(path));试试
流里面的数据已经被你全部读完了,也写入文件了
就连标志位你都读了,那个流里已经没有数据了,当然阻塞!
你已经读完文件再用ImageIO.read(fileIS)属于画蛇添足,多此一举!
if(f.exists()){
ImageIO.read(f);
System.out.println(1);
} ,结果是一样的,都是无响应。
文件是存在的,代码里面判断了文件是否存在,图片是.jpg的格式
while ((c = fileIS.read(bytes)) != -1) {
fileOS.write(bytes, 0, c);
}
会不会一直在这循环呢?
在ImageIO.read()方法里的,1325行
ImageInputStream stream = createImageInputStream(input);
这里卡住了~~
然后再进去到最终停止的那行代码,是在FileCacheImageInputStream.class的88行:
Disposer.addRecord(disposerReferent, disposerRecord);方法。这个方法就不能再进去了。
到底是死在88行还是94行?Disposer.addRecord(disposerReferent, disposerRecord);在我这是94行。
我这边是88行,我的94行是一排注解。我这边DEBUG显示disposerReferent里面什么都没有:然后用step into就进不去了。