ios上传文件后台获取文件大小为0_网盘文件的上传与下载

本文探讨了iOS在上传文件到后台时遇到的问题,即后台获取到的文件大小显示为0。文章通过分析上传流程,包括JSP页面、Controller、Service层的处理,以及自定义异常解析器的实现,详细阐述了问题的原因。同时,文中还提及了SpringMVC中针对异常处理的配置,并提供了MD5工具类的相关内容。此外,文件下载的部分也作为补充进行了说明。
摘要由CSDN通过智能技术生成

1.文件上传

jsp页面

ff7aea46a0a5d2f504ae7d18e6fa0a15.png

controller

	@RequestMapping("/upload")
	public String uploadFile(@RequestParam MultipartFile[] files,HttpSession session)throws UploadExeception {
		//获取session中UserInfo对象
		UserInfo user = (UserInfo) session.getAttribute("user");
		//获取用户名
		String username = user.getUserName();
		//定义集合对象存储文件信息
		List<FileInfo> fileInfols = new ArrayList<FileInfo>();
		for (MultipartFile file : files) {
			//获取上传文件的大小(单位:字节)
			long size = file.getSize();
			//获取上传文件的文件名
			String fileName =file.getOriginalFilename();
			/*
			 * 生成uuid,使用md5加密,作为文件提取秘钥
			 */
			UUID uuid = UUID.randomUUID();
			String fileCode = MD5Utils.createMD5(uuid.toString());
			//文件存储路径
			String filePath = username + "/" + uuid+ fileName.substring(fileName.indexOf("."));
			//把文件信息封装到对象中
			FileInfo fileInfo = new FileInfo(fileName, size, fileCode, filePath, user.getUserId());
			//添加到集合中
			fileInfols.add(fileInfo);
		}
		//上传文件的文件夹目录
		String fileDir = session.getServletContext().getRealPath("/upload");
		//用户文件夹目录
		String userDir=fileDir+"/"+username;
		//调用service进行业务逻辑的判断并把文件信息添加到数据库中
		fileInfoService.upload(fileInfols, userDir, user.getUserType());
		//创建集合对象存储文件对象
		List<File> FileList = new ArrayList<File>();
		for (FileInfo fileInfo : fileInfols) {
			FileList.add(new File(fileDir, fileInfo.getFilePath()));
		}
		int index=0;
		for (MultipartFile file : files) {
			try {
				//进行文件的上传
				file.transferTo(FileList.get(index++));
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return "redirect:/user/fileInfo";
	}

service

public void upload(List<FileInfo> fileInfols, String userDir, int userType)
			throws UploadExeception {
		// 记录上传文件的总大小
		long fileTotalSize = 0;
		// 记录上传目录下文件的总大小
		long dirFileSize = 0;
		/*
		 * 获取服务器下用户目录已上传的文件所占的空间大小
		 */
		File dir = new File(userDir);
		if (dir.exists()) {
			if (dir.isDirectory()) {
				File[] listFiles = dir.listFiles();
				for (File file : listFiles) {
					dirFileSize += file.length();
				}
			}
		} 
		for (FileInfo fileInfo : fileInfols) {
			long fileSize = fileInfo.getFileSize();
			/*
			 * 判断普通会员
			 */
			if (userType == 1) {
				if (fileSize > 1024 * 1024) {
					throw new UploadExeception("文件大小不能超过1M");
				}
				// 普通会员剩余空间
				long commonSurplusSize = 32 * 1024 * 1024 - dirFileSize;
				// 判断普通会员剩余空间是否足够
				if (commonSurplusSize < fileSize ) {
					throw new UploadExeception("可用空间不足");
				}
				/*
				 * 判断vip会员
				 */
			} else if (userType == 2) {
				if (fileSize > 1024 * 2 * 1024) {
					throw new UploadExeception("文件大小不能超过2M");
				}
				// 计算总上传的文件大小
				fileTotalSize += fileSize;
			}
		}
		// vip会员剩余空间
		long vipSurplusSize = 128 * 1024 * 1024 - dirFileSize;
		// 判断vip会员剩余空间是否足够
		if (vipSurplusSize <fileTotalSize ) {
			throw new UploadExeception("可用空间不足");
		}
		//进行遍历,调用mapper层,把文件信息添加到数据库中
		for (FileInfo file : fileInfols) {
			fileInfoMapper.addFileInfo(file);
		}

	}

自定义异常解析器(实现HandlerExceptionResolver接口):

b4a8665dbf71a85cbd2554dda5cd5be4.png

springmvc.xml中的配置(注意:id值固定为handlerExceptionResolver)

<bean id="handlerExceptionResolver" class="com.exeception.UploadExecetionHandle"></bean>

MD5工具类:

public class MD5Utils {
	/**
	 * 对字符串进行加密
	 * @param str
	 * @return
	 */
	public static String createMD5(String str){
		try {
			MessageDigest messageDigest = MessageDigest.getInstance("MD5");
			//将字符串转换为字节数组
			byte[] oldBytes=  str.getBytes("iso-8859-1");
			//对字节数组进行加密
			byte[] md5Bytes = messageDigest.digest(oldBytes);
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < md5Bytes.length; i++) {
				byte b = md5Bytes[i];
				int val = ((int)b)&0xff;//与一个16进制的数值进行与运算
				if(val<10){
					sb.append(0);
				}
				sb.append(Integer.toHexString(val));//转换为16进制
			}
			return sb.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
}

2.文件的下载

	   @RequestMapping("/downLoad")
	      public ResponseEntity<byte[]> download( String fileCode,
			HttpSession session) throws IOException {
		FileInfo fileInfo = fileInfoService.getFileInfoByFileCode(fileCode);
		String uploadDir = session.getServletContext().getRealPath("/upload");
		File file = new File(uploadDir, fileInfo.getFilePath());
		String filename = fileInfo.getFileName();
		 filename = new String(filename.getBytes("utf-8"),"ISO-8859-1");		
		HttpHeaders httpHeaders = new HttpHeaders();
		httpHeaders.setContentDispositionFormData("attachment", filename);
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值