上传文件-阿里云开发者社区

开发者社区> 技术小胖子> 正文

上传文件

简介:
+关注继续查看

1、jsp中注意问题

//文件上传,注意form中要定义  enctype="multipart/form-data"

<form action="<%=basePath%>system/appversion/save.do" method="post" 
	 id="form-appversion-edit-add" enctype="multipart/form-data" >
	<div>
		<label >文件:</label>
		<input type="file" name="apkFile"  id="apkFile"><button type="button" id="uploadButton" onclick="uploadApk()">上传</button>
	</div>
	<div >
		<label >文件路径:</label>
		<input type="text" class="input-text" value="${pd.appUrl }" name="appUrl" id="appUrl_edit" datatype="*" nullmsg="请选择文件" readonly="readonly">
	</div>
	
	<div>		
		<input id="appEdit_submitButton" class="btn btn-primary radius" type="submit" value="&nbsp;&nbsp;提交&nbsp;&nbsp;">
	</div>	
</form>

②js中ajax中提交文件

<script type="text/javascript">
	//上传文件,这里是封装到form数据中传给后台。不是form的submit提交。
	function uploadApk(){
		var apkFile = $("#apkFile").val();
		if(apkFile == ''){
			layer.alert("请选择文件");
			return;
		}
		var formData = new FormData($("#apkFile")[0].files[0]);
		formData.append("apkFile",$("#apkFile")[0].files[0]);
		$.ajax({
			type:'POST',
			url:'system/appversion/upload.do',
			data:formData,
			dataType:"json",
			processData : false, 
			contentType : false,
			success: function(data){
				$("#appUrl_edit").val(data.appUrl);
				$("#uploadButton").attr("disabled", true); 
			},
			error: function(err){
				layer.alert("服务器错误");
			}
		});
	}

</script>


③后台上传的方法

	/**
	 *app版本管理上传文件
	 * 
	 * @param
	 * @throws Exception
	 */
	@ActionDesc(description="app版本管理上传文件",methodType="post")
	@RequestMapping(value = "/upload")
	@ResponseBody
	public AppVersion upload(@RequestParam(required = false)MultipartFile apkFile) throws Exception {
		String appUrl = "";
		if (!apkFile.isEmpty()) {
			// 文件原名称
			String fileName = apkFile.getOriginalFilename();
			String formatDay = DateUtil.getDays();
			// 为了避免重复简单处理
			String photoImagePath = PropertyUtil.readValue(Const.APK_PATH);
			long currentTimeMillis = System.currentTimeMillis();
			// 上传位置路径
			String path0 = photoImagePath + "/" + formatDay + "/" + currentTimeMillis + "/" + fileName;
			// 按照路径新建文件
			File newFile = new File(path0);
			File newFile1 = new File(photoImagePath + "/" + formatDay + "/" + currentTimeMillis);
			if (!newFile1.exists()) {
				newFile1.mkdirs();
			}
			// 复制
			FileCopyUtils.copy(apkFile.getBytes(), newFile);
			appUrl = "appversion/downloadNewApk.do?newApkUrl=" + path0;
		}
		AppVersion appVersion = new AppVersion();
		appVersion.setAppUrl(appUrl);
		return appVersion;
	}


④后台下载方法

只要不是在项目中,即在其他目录下,那么就需要通过流的方式去读取文件,返回一个流。

/**
	 * 下载apk
	 * 
	 * @param newApkUrl
	 *            最新的apk下载的URL
	 * 
	 */
	@ActionDesc(description = "下载apk", methodType = "post")
	@RequestMapping("/downloadNewApk")
	@ResponseBody
	public void downloadNewApk(String newApkUrl) throws Exception {
		HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getResponse();// 获取response
		if (!Tools.isEmpty(newApkUrl)) {
			// 文件路径(windows下是\\,linux下是//,都必须是绝对路径)
			String path = PropertyUtil.readValue(Const.APK_PATH) + newApkUrl;
			// java中用File类来表示一个文件
			java.io.File newFile = new java.io.File(path);
			// 测试这个文件路径是否存在(也就是这个文件是否存在)
			if (!newFile.exists()) {
				return;
			}
			// FileUtils.readFileToByteArray(File file)把一个文件转换成字节数组返回
			byte[] data = FileUtils.readFileToByteArray(newFile);
			String[] strArr = newApkUrl.split("/");
			String fileName = strArr[strArr.length - 1];
			response.reset();
			// 设置文件的返回类型
			response.setContentType("application/octet-stream;charset=UTF-8");
			response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
			response.addHeader("Content-Length", "" + data.length);
			OutputStream outputStream = response.getOutputStream();
			outputStream.write(data);
			// java在使用流时,都会有一个缓冲区,按一种它认为比较高效的方法来发数据:
			// 把要发的数据先放到缓冲区,缓冲区放满以后再一次性发过去,而不是分开一次一次地发.
			// 而flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满.
			outputStream.flush();
			outputStream.close();
		} else {
			return;
		}
	}





      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/2045378,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10074 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13882 0
SSH 文件上传错误:encountered 1 errors during the transfer终极解决方法:
以下方法简单排序,从简单到复杂: 法一:在SSH Secure File Transfer(上传文件那个),打开“Operation”菜单,打开“File Transfer Mode”子菜单,再选择“Binary”,OK! 法二:把服务器上同名文件删掉再传 法三:如果文件在桌面上,将要上传的文件复制到其它分区,再上传! 法四:到 http://winscp.
831 0
CSharp文件读取与写入入门图解
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。
666 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载