结一下,JavaWeb前后端常见的几种上传文件的方式:
一、JavaWeb前端上传文件的几种方式:
1、表单上传
最传统的图片上传方式是form表单上传,使用form表单的input[type="file"]控件,打开系统的文件选择对话框,从而达到选择文件并上传的目的。
代码示例如下:
<form action="uploadFile" method="post"
enctype="multipart/form-data">
<label for="file">文件名</label>
<input id="file" name="file" type="file"/>
<input type="submit" name="submit" value="提交"/>
</form>
表单上传需要注意以下几点:
(1)提供form表单,method必须是post类型。
(2)form表单的enctype必须是multipart/form-data。
enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为“application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码。HTML表单如何打包数据文件是由enctype这个属性决定的。enctype有以下几种取值:
默认enctype=application/x-www-form-urlencoded,所以表单的内容会按URL规则编码,然后根据表单的提交方法:
method='get' 编码后的表单内容附加在请求连接后,
method='post' 编码后的表单内容作为post请求的正文内容。
(3)提供input type="file"上传输入域。
2、Ajax上传
ajax和FormData可实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口。通过FormData对象可以更灵活方便地发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data,则通过FormData传输的数据格式和表单通过submit()方法传输的数据格式相同。
<form>
<input type="file" name="file" id="file"/>
</form>
<script>
$("#file").on("change", function() {
var formData=new FormData();
formData.append("file", $("#file")[0].files[0]);
$.ajax({
url: "uploadFile",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(response) {
alert("hahaha");
}
});
})
</script>
ajax无刷新上传的方式,本质上与表单上传无异,只是把表单里的内容提出来采用ajax提交,并且由前端决定请求结果回传后的展示结果。
3、各类插件上传
当上传的需求要求可预览、显示上传进度、中断上传过程、大文件分片上传等等,这时传统的表单上传很难实现这些功能,我们可以借助现有插件完成。
如:百度上传插件Web Upload、jQuery图片预览插件imgPreview、拖拽上传与图像预览插件Dropzone.js等等。
二、JavaWeb后端上传文件的几种方式:
1、使用springMVC原生上传文件方法
(1)首先需要一些简单的配置
<bean id="multipartResolver" class="com.zxm.fileupload.
UploadCommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960"/>
</bean>
(2)controller中的代码:
@RequestMapping("upload")
public String upload(HttpServletRequest request) throws
IllegalStateException, IOException {
long startTime=System.currentTimeMillis();
//将当前上下文初始化给CommonsMutipartResolver(多部分解析器)
CommonsMultipartResolver multipartResolver=new
CommonsMultipartResolver(
request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext()) {
//一次遍历所有文件
MultipartFile file=multiRequest.
getFile(iter.next().toString());
if(file!=null) {
String path="E:/upload/"+
file.getOriginalFilename();
//上传
file.transferTo(new File(path));
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("Spring方法的运行时间:"
+String.valueOf(endTime-startTime)+"ms");
return "success";
}
2、采用file.Transto来保存上传的文件,这是目前自认为最好的上传方式,代码简单,速度快
@RequestMapping("upload")
public String upload(@RequestParam("file")
CommonsMultipartFile file) throws IOException {
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
String path="E:/upload/" + new Date().getTime()+
file.getOriginalFilename();
File newFile=new File(path);
//通过CommonsMultipartFile的方法直接写文件
file.transferTo(newFile);
long endTime=System.currentTimeMillis();
System.out.println("采用file.Transto的运行时间:"
+String.valueof(endTime-startTime)+"ms");
return "success";
}
3、采用流的方式上传
此方式又慢又难写
@RequestMapping("upload")
public String upload(@RequestParam("file")
CommonsMultipartFile file) throws IOException {
//用来检测程序运行时间
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename);
try {
//获取输出流
OutputStream oStream=new FileOutputStream(
"E:/upload/"+new Date().getTime() +
file.getOriginalFilename());
//获取输入流CommonsMultipartFile中可以直接得到文件的流
InputStream iStream=file.getInputStream();
byte[] bts=new byte[1024];
//一个字节一个字节地读取并写入
while(iStream.read(bts)!=-1) {
oStream.write(bts);
}
oStream.flush();
oStream.close();
iStream.close();
} catch(FileNotFoundException e) {
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("采用流上传的方式的运行时间:"+
String.valueOf(endTime-startTime)+"ms");
return "success";
}
JavaWeb后台上传的这三种方式中,第二种最优,第一种次之,第三种最不推荐。
程序开发中,难免遇到有多图上传的需求,如果自己写吧,是可以完成的,但可能会影响项目的进度,也可能没那么完美,今天给大家介绍一个实用的多文件上传插件webuploader,可以实现多图上传、大文件分片上传等。
现看看效果图吧:
demo可以去我的百度网盘下载,链接:https://pan.baidu.com/s/1i5IR7oh 密码:5rlh
实现过程是非常简单的,按照以下代码即可完成:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>jQuery多张图片批量上传插件</title>
<script src="./js/jquery.js"></script>
<link rel="stylesheet" type="text/css" href="./css/webuploader.css">
<link rel="stylesheet" type="text/css" href="./css/diyUpload.css">
<script type="text/javascript" src="./js/webuploader.html5only.min.js"></script>
<script type="text/javascript" src="./js/diyUpload.js"></script>
</head>
<style>
*{ margin:0; padding:0;}
#box{ margin:50px auto; width:540px; background:#FF9}
#demo{ margin:50px auto; width:540px; background:#CF9}
</style>
<body>
<div id="box">
<div id="test" ></div>
</div>
<div id="demo">
<div id="as" ></div>
</div>
</body>
<script type="text/javascript">
/*
* 服务器地址,成功返回,失败返回参数格式依照jquery.ajax习惯;
* 其他参数同WebUploader
*/
$('#test').diyUpload({
url:'./fileupload.php',
success:function( data ) {
console.info( data );
},
error:function( err ) {
console.info( err );
}
});
$('#as').diyUpload({
url:'./fileupload.php',
success:function( data ) {
console.info( data );
},
error:function( err ) {
console.info( err );
},
buttonText : '选择文件',
chunked:true,
// 分片大小
chunkSize:512 * 1024,
//最大上传的文件数量, 总文件大小,单个文件大小(单位字节);
fileNumLimit:50,
fileSizeLimit:500000 * 1024,
fileSingleSizeLimit:50000 * 1024,
accept: {}
});
</script>
</html>
avaScript开发——文件夹的上传和下载,JavaScript实现文件夹的上传和下载,JavaScript实现文件夹的上传和下载解决方案,JavaScript实现文件夹的上传和下载思路,JavaScript实现文件夹的上传和下载源码,JavaScript实现文件夹的上传和下载实例,JavaScript实现大文件分块上传和下载,JavaScript实现大文件分片上传和下载,JavaScript实现大文件加密上传和下载,JavaScript实现大文件批量上传和下载,
前端用了JS,JQuery,vue2,vue3,vue-cli,html5,html
网上搜了一下,基本上大部分的文章里面提到的前端JS或VUE或HTML5上传文件夹的方案都是使用JS的API来实现的,也就是html5提供的一个API,也就是chrome提供的API。用是能用,但是不够好用,有很多限制,也不够灵活。不太能够满足用户的实际应用需求,
多多少少还是有点问题,稳定性,灵活性,可扩展性,安全性方面还是有点问题。chrome的每个域名只允许5个TCP连接的限制,这个基本上是一个无法逾越的鸿沟,目前为止网上还没有发现哪家公司或者个人能够突破的。
我们做项目的话个人用户比较少,一般都是行业用户,比如政府,公司,金融,这类企业,他们对用户体验要求较高。就实际项目开发和实施的情况来看,html5或者chrome提供的功能基本上都是不能够满足他们需求的,都需要我们进行定制开发。
文件夹上传,html5提供了API,用户开始用的时候还行,然后就提了要求要求支持断点续传,
断点续传,就是在文件上传的过程中发生了中断,人为因素(暂停)或者不可抗力(断网或者网络差)导致了文件上传到一半失败了。然后在环境恢复的时候,重新上传该文件,而不至于是从新开始上传的。
断点续传的功能是基于分块上传来实现的,把一个大文件分成很多个小块,服务端能够把每个上传成功的分块都落地下来,客户端在上传文件开始时调用接口快速验证,条件选择跳过某个分块。
实现原理,就是在每个文件上传前,就获取到文件MD5取值,在上传文件前调用接口,如果获取的文件状态是未完成,则返回所有的还没上传的分块的编号,然后前端进行条件筛算出哪些没上传的分块,然后进行上传。
当接收到文件块后就可以直接写入到服务器的文件中。
导入项目:
导入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2
下载示例:
https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/
工程
NOSQL
NOSQL示例不需要任何配置,可以直接访问测试
创建数据表
选择对应的数据表脚本,这里以SQL为例
修改数据库连接信息
访问页面进行测试
文件存储路径
up6/upload/年/月/日/guid/filename
相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件
相关参考:
文件保存位置
源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
*请认真填写需求信息,我们会在24小时内与您取得联系。