js文件的上传和下载
### 一、文件上传
##### 1、浏览器上传要求:
###### a、表单 method 属性应该设置为 post
###### b、enctype="multipart/form-data"、表单必须设置该属性 二进制
##### 2、服务器端存储上传图片要求
###### a、必须在Servlet类添加@MultipartConfig注解、代表支持上传文件的Servlet
###### b、每一个浏览器的上传文件就是一个Part对象、通过request.getPart("file")得到
###### c、使用part.write()方法存储上传的文件
###### d、多文件使用Collection<Part> parts = request.getParts()获取
##### 3、Part常用方法
| 方法名 | 作用 |
| :--------------------: | :----------------------------------: |
| write() | 文件写入(参数为:完整路径和文件名) |
| getContentType() | 获取上传文件的类型 |
| getSubmittedFileName() | 获取上传文件的名称 |
| getSize() | 获取上传文件的大小、单位字节 |
##### 4、Ajax异步文件上传
###### a、jquery的文件上传
```javascript
$.ajax({
url: "../TestServlet01",
data: new FormData($("#form1")[0]),
type: "post",
//cache: false,//上传文件无需缓存
processData: false,//用于对data参数进行序列化处理 这里必须false
contentType: false, //必须
success: function (result) {
alert("上传完成!");
}
})
```
###### b、axios的文件上传
```javascript
//获取整个文件上传组件(这个组件可能包含多个文件)
let img1 = document.getElementById('file1')
//封装要上传的对象
let formData = new FormData()
//传递的第一个图片对象、参数(key、value、文件名)、多文件上传继续拼接即可
formData.append("file1", img1.files[0], img1.files[0].name)
formData.append("name", "张三")
axios.post("http://localhost:8080/javaeedemo002/Servlet001", formData, {
//设置上传的头文件
headers: {"Content-Type": "multipart/form-data;boundary=" + new Date().getTime()}
}).then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});
```
### 二、文件下载、固定代码
```java
response.setContentType("application/x-download");
//设置下载数据的格式
response.addHeader("Content-Disposition","attachment;filename=a.jpg");
//获取需要下载的文件如今
File file=new File(request.getServletContext().getRealPath("/img/1.jpg"));
//创建文件流
FileInputStream fis=new FileInputStream(file);
//每次读写1024KB
byte[] b=new byte[1024];
int i=-1;
while ((i=fis.read(b))>0) {
//开始给客户端传输数据
response.getOutputStream().write(b,0,i);
}
```