上传文件

简介:

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,如需转载请自行联系原作者


相关文章
|
6月前
|
C#
C#文件上传
C#文件上传
28 0
|
3月前
|
对象存储
阿里云上传文件
阿里云上传文件
106 0
|
6月前
|
存储 移动开发 JavaScript
|
前端开发
前端上传文件或者上传文件夹
前端上传文件或者上传文件夹
176 0
前端上传文件或者上传文件夹
下载文件
下载文件
87 0
|
开发者
上传文件到服务器 | 学习笔记
快速学习上传文件到服务器。
112 0
上传文件到服务器 | 学习笔记
|
XML 缓存 Java
sevlet3.0上传文件功能
在sevlet3.0以前,java上传文件很麻烦,要么用底层的request.getinputstream。获取流,但是这个流不是干净的流,报过上传的文件名都在文件的前部分,包括文件的结尾也有特殊的字符。需要使用io层层过滤。提取你所需要的文件,鉴于水平有限,我只能提txt文本文件的内容,然而一道图片处理总是丢失或者多出一些东西来。知道原理后也不打算深入研究。
62 0
|
JavaScript
你真的了解文件上传吗?
你真的了解文件上传吗?
如何修改Kestrel上传文件的大小
如何修改Kestrel上传文件的大小
168 0