struts2 多文件上传的一点疑问

发布于 2021-11-08 19:27:12 字数 4669 浏览 939 评论 4

项目中,客户要求每个活动必须有活动图片,包括产品介绍等。

上传没什么问题,关键是修改。

修改的时候,如果只修改一个文件,就会报酱紫的错误。

数据越界。

代码如下:

 

	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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

把回忆走一遍 2021-11-12 13:12:48

最好不要 在浏览器上做 多文件同时长传, 不稳定的。

最好单个文件上传。  

在流程上设计一下。 discuz论坛中发表帖子的时候有上传附件功能,

你可以参考一下。

背叛残局 2021-11-12 10:57:02

引用来自#3楼“傲焰枫”的帖子

修改?不太明白。。

不是一个一个的修改吗?

可是我不能没有你 2021-11-10 13:01:34

修改?不太明白。。

不是一个一个的修改吗?

清晨说ぺ晚安 2021-11-10 01:48:59

有人说,如果是多文件上传,需要把文件分开保存路径。如果文件多了,同一个action里面属性就泛滥了,个人认为不可取。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文