使用Java的io完成文件上传速度较慢

向太阳奔跑 2012-05-07 01:23:17
我的项目是一个mvc模式,使用了ssh那三个框架。目前有一个需求是需要批量上传图片到服务器上,我在前台使用了jquery的uploadify的插件完成前台的操。而后台我在service层封装了一个图片读写的方法。在action中有一个List的集合,元素是File类型的,来接接受前台传过来的文件。然后我在action中遍历这个集合来循环执行service层封装的那个图片读写的方法。因为我们要对传过来的图片还要进行一次图片的压缩,图片的压缩已经有现成的封装好的方法。我就是在service层中封装的那个文件读写操作的方法里有调用了这个图片压缩的方法。但是现在有一个问题是,如果我上传多个超过1M多的图片,服务器上的原图是好的,但是就是不执行图片压缩。说的好乱,我直接上代码:

public Long uploadAlbumPhoto(File file, String accountId, String fileName,
AblumPhotoDto albumPhotoDto) {
String uploadPath = accountId + File.separator + albumPhotoDto.getAlbumId();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
InputStream imageIs = null;
Long albumPhotoId = null;
try {
File path = new File(albumPath + File.separator + uploadPath); // 存放照片的文件夹根据用户的id与相册id分文件夹存放
if (!path.exists()) {
path.mkdirs();

}

// 生成新的文件名
Long start = System.currentTimeMillis();
String middle = StringTools.getRandomStr(10);
String suffixFileName = fileName.substring(fileName.lastIndexOf("."));
String newFileName = start.toString() + "_" + middle + suffixFileName;

File destFile = new File(path, newFileName); // 得到图片保存的位置(根据root来得到图片保存的路径在tomcat下的该工程里)
bis = new BufferedInputStream(new FileInputStream(file), 102400);
bos = new BufferedOutputStream(new FileOutputStream(destFile), 102400);
byte[] buffer = new byte[102400];
int length = 0;
while ((length = bis.read(buffer)) != -1) {
bos.write(buffer, 0, length);
}
bos.flush();

int size = (int) (destFile.length() / 1024);
imageIs = new FileInputStream(destFile);
BufferedImage buff = ImageIO.read(imageIs);
int high = buff.getHeight();
int width = buff.getWidth();

// 生成缩略图,大小为宽232像素,高为178像素
ImageSlimUtil.saveMinImageByParam(albumPath, (File.separator + uploadPath).replace("\\", "/"), (File.separator + newFileName).replace("\\", "/"), 232, 178);
albumPhotoId = sequenceDao.getSequence(SequenceEnum.Album_Photo_Sequence.name);
String photoName = fileName.substring(0, fileName.lastIndexOf("."));
TAblumPhoto tAlbumPhoto = this.albumPhotoDtoToPo(albumPhotoDto);
tAlbumPhoto.setSequenceId(albumPhotoId);
tAlbumPhoto.setPhotoUrl(uploadPath + File.separator + newFileName);
tAlbumPhoto.setPhotoName(photoName);
tAlbumPhoto.setSize(Integer.valueOf(size));
tAlbumPhoto.setHigh(String.valueOf(high));
tAlbumPhoto.setWidth(String.valueOf(width));
tAlbumPhoto.setCreateDate(new Date());

if (tAlbumPhoto.getPohotoStatus() == null) {
tAlbumPhoto.setPohotoStatus("1");
}

// 在第一次给用户的某个相册上传照片时,设置上传的第一张默认为这个相册的封面
List<TAblumPhoto> photoList = albumPhotoDao.findAlbumPhoto(albumPhotoDto.getAlbumId());
if (photoList != null && photoList.size() > 0) {
tAlbumPhoto.setCover("0");
} else {
tAlbumPhoto.setCover("1");
}

albumPhotoDao.saveAlbumPhoto(tAlbumPhoto);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bis != null) {
bis.close();
bis = null;
}
if (bos != null) {
bos.close();
bos = null;
}
if (imageIs != null) {
imageIs.close();
imageIs = null;
}
} catch (IOException e) {

e.printStackTrace();

}
}
return albumPhotoId;
}

这是后台图片上传的方法,大家帮帮忙给看看为什么会出现那个问题。还有一个问题是,我在这个方法里有执行了 BufferedImage buff = ImageIO.read(imageIs)来得到图片的宽高,所以整个图片上传的速度在线上测试太慢了!
...全文
847 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向太阳奔跑 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那就不是你这里的问题 那就是你调用的那个压缩方法有问题。。图片过大的时候压缩就有问题
[/Quote]
那个只是偶尔会出现。。。
向太阳奔跑 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

uploadify 我以前也用过,我当时用的是php版本的,所以不知道java是什么状况。
我不知道你是什么实现的,我当时的步骤是通过uploadify异步上传文件,上传之后,把保存的文件路径传回到前台,所有文件上传成功之后,再点击确定按钮,处理这些路径。
你的意思是好像上传图片和压缩处理好像是在一个动作里完成了啊??
[/Quote]
单文件上传没有问题,多文件上传也没有问题,我说的那个只是偶尔会出现。。。
那问下那个uploadify上传时,因为后台我要把图片的宽高和大小保存在数据库,我先问下uploadify上传时怎么同时把没个图片的宽高和尺寸传递到后台。。。
cxw3152 2012-05-07
  • 打赏
  • 举报
回复
那就不是你这里的问题 那就是你调用的那个压缩方法有问题。。图片过大的时候压缩就有问题
watermarkmms 2012-05-07
  • 打赏
  • 举报
回复
你先保证你的多图片单单上传会不会有问题,如果没单单上传没问题,那么你在成功之后,注释掉压缩代码,换成坚持其他打印语句,看看行不行,先弄清楚问题出在哪一步,在慢慢来处理吧。
不过返回保存路径的方法是需要修改它的包里的js源码,有点头疼。你先把问题自己检查下,再往上检查一步看看,说不定会突然检查出来,多张图片,只压缩了一张什么的这种情况,先确认下吧。不行就贴代码咯,或者帮你找找以前的代码,多图片肯定是没问题的,可能是你哪里写错了
watermarkmms 2012-05-07
  • 打赏
  • 举报
回复
uploadify 我以前也用过,我当时用的是php版本的,所以不知道java是什么状况。
我不知道你是什么实现的,我当时的步骤是通过uploadify异步上传文件,上传之后,把保存的文件路径传回到前台,所有文件上传成功之后,再点击确定按钮,处理这些路径。
你的意思是好像上传图片和压缩处理好像是在一个动作里完成了啊??
向太阳奔跑 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

自己先调试一下咯,先搞清楚,是压缩的代码没执行到,还是执行的时候失败,还是干脆service都没进来
[/Quote]
调试过了,是压缩代码没有执行到。。。
问题是超过1M多的图片,如果一次上传多张就会这样,而一次上传一张就不会。。。
watermarkmms 2012-05-07
  • 打赏
  • 举报
回复
自己先调试一下咯,先搞清楚,是压缩的代码没执行到,还是执行的时候失败,还是干脆service都没进来

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧