struts2 多文件上传的一点疑问
项目中,客户要求每个活动必须有活动图片,包括产品介绍等。
上传没什么问题,关键是修改。
修改的时候,如果只修改一个文件,就会报酱紫的错误。
数据越界。
代码如下:
private static final long serialVersionUID = -3370191492289450674L; private Mall_Product mallProduct; private File[] upload; private String[] uploadFileName; private String[] uploadContentType; private String savePath; private static final int BUFFER_SIZE = 1 * 1024;//上传文件的大小 public File[] getUpload() { return upload; } public void setUpload(File[] upload) { this.upload = upload; } public String[] getUploadFileName() { return uploadFileName; } public void setUploadFileName(String[] uploadFileName) { this.uploadFileName = uploadFileName; } public String[] getUploadContentType() { return uploadContentType; } public void setUploadContentType(String[] uploadContentType) { this.uploadContentType = uploadContentType; } public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } private MallProductManageService mallProductManageService; public Mall_Product getMallProduct() { return mallProduct; } public void setMallProduct(Mall_Product mallProduct) { this.mallProduct = mallProduct; } public MallProductManageService getMallProductManageService() { return mallProductManageService; } public void setMallProductManageService( MallProductManageService mallProductManageService) { this.mallProductManageService = mallProductManageService; } /** * 文件上传 复制文件拷贝的方法 * @param src 源文件 * @param dst 上传至服务器的文件 */ private static void copy(File src, File dst) { InputStream in = null; OutputStream out = null; try { System.out.println("开始上传"+src.getName()); in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); //从输入流读取数据到输出流 byte[] buffer = new byte[BUFFER_SIZE]; int len = 0; int j=0; while ((len = in.read(buffer)) > 0) { System.out.println(j); j++; out.write(buffer, 0, len); } //强制刷新输出流 out.flush(); } catch (Exception e) { throw new YZTException(e.getMessage(), e); } finally { System.out.println("处理"); if (null != in) { try { in.close(); } catch (Exception e) { throw new RdsException(e.getMessage(), e); } } if (null != out) { try { out.close(); } catch (Exception e) { throw new RdsException(e.getMessage(), e); } } } } @Override public String execute() throws Exception { System.out.println("修改action保存商品图片"); String dstPath=""; upload=this.getUpload(); System.out.println(upload); if(this.upload!=null){ System.out.println("开始"+this.upload.length); for (int i = 0; i < upload.length; i++) { dstPath=ServletActionContext.getServletContext().getRealPath("/upload"); System.out.println("默认"+dstPath); dstPath=dstPath+"\"+this.uploadFileName[i]; System.out.println("文件名:"+i+":"+this.uploadFileName[i]); System.out.println("保存位置:"+i+":"+dstPath); System.out.println("文件类型:"+i+":"+this.getUploadContentType()[i]); System.out.println("文件保存成功"+i); MallUpdateProductAction.copy(this.upload[i], new File(dstPath)); } mallProduct.setMall_product_image1(this.uploadFileName[0]); mallProduct.setMall_product_image2(this.uploadFileName[1]); mallProduct.setMall_product_image3(this.uploadFileName[2]); System.out.println("结束"); } mallProduct.setMall_product_member_price((new SpecialMethod().getDoubleFormat(mallProduct.getMall_product_member_price()))); mallProduct.setMall_product_active_price((new SpecialMethod().getDoubleFormat(mallProduct.getMall_product_active_price()))); mallProduct.setMall_official_retail_price(new SpecialMethod().getDoubleFormat(mallProduct.getMall_official_retail_price())); mallProductManageService.updateMallProduct(mallProduct); return "success"; }
我看了下算法有点问题
1.如果只修改一个图片,那么另两张图片为null.
2.如果写if判断,需要把几种情况都考虑到,一个为空,两个为空......否则执行execute方法都会执行上传。
应该有更好的方法解决这个问题吧。
希望能给我点思路,谢谢啦!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
最好不要 在浏览器上做 多文件同时长传, 不稳定的。
最好单个文件上传。
在流程上设计一下。 discuz论坛中发表帖子的时候有上传附件功能,
你可以参考一下。
引用来自#3楼“傲焰枫”的帖子
修改?不太明白。。
不是一个一个的修改吗?
修改?不太明白。。
不是一个一个的修改吗?
有人说,如果是多文件上传,需要把文件分开保存路径。如果文件多了,同一个action里面属性就泛滥了,个人认为不可取。