Upload 学习笔记

Upload 学习笔记

一、基础

<form id="upload" enctype="multipart/form-data" method="post"> 
	<input type="file"  multiple="multiple" id="files" 
		onChange={(event)=>{
			//这个files就是获取的file文件的一个数组。之后你可以使用任何方式来操作它。
			console.log(event.target.files);
		}}
	/>
</form> 

1. multiple=“multiple” 可接受多个值的文件上传字段

input[type=“file”]可以实现上传多个文件,只需要给添加multiple="multiple"属性便实现同时上传多个文件效果。

2. accept=“application/x-msdownload,video/*”

input[type=“file”]可以实现限定上传的文件类型,只需要给添加 accept=“video/*”(限定只上传视频文件)属性。

可以通过accept规定上传的文件类型,可以定义多个文件类型,用逗号隔开。

3.解析获取input[type=“file”]的文件数据

如果你想要选中文件就自动提交可以给input[type=“file”]onchange的改变事件,当你选择完文件就会执行该事件。
input[type=“file”]数据解析
从输出的数据分析就知道获取的数据是一个数组,可以根据length获取上传的某个文件的信息

 let f=document.getElementById("files");
	console.log(f.files);
	//转换文件为URL访问资源,或者用下文 FileReader.result
	const windowURL = window.URL || window.webkitURL;
    const dataURL = windowURL.createObjectURL(fileObj);

4.如何与后台交互数据

可以通过form表单提交,但注意要给form表单添加两个属性
1.method=“post” 要用post提交。
2. enctype=“multipart/form-data” 要修改请求参数的格式

可以通过由表单构造的FormData对象,将需要请求参数以键值对的形式添加到FormData构造函数,由FormData构造函数传递数据给后台

 let form = document.getElementById('upload'), 
 let formData = new FormData(form); 
 
//          (传输属性名,传输对应数据)
formdata.append('name',data); 

二、Antd Upload

import { Upload, message } from 'antd';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';

function getBase64(img, callback) {
	
  const reader = new FileReader();
  //事件处理,监听load触发时执行callback,即给state设置imageUrl
  /*<img src="https://img-blog.csdnimg.cn/2022010619273051994.jpeg" alt="avatar" style="width: 100%;">
  */
  reader.addEventListener('load', () => callback(reader.result));
  //触发 load 事件,当读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend 事件
  reader.readAsDataURL(img);
}

//对上传文件类型检查和大小检查
function beforeUpload(file) {
  const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
  if (!isJpgOrPng) {
    message.error('You can only upload JPG/PNG file!');
  }
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!isLt2M) {
    message.error('Image must smaller than 2MB!');
  }
  return isJpgOrPng && isLt2M;
}

class Avatar extends React.Component {
  state = {
    loading: false,
  };

  handleChange = info => {
    if (info.file.status === 'uploading') {
      this.setState({ loading: true });
      return;
    }
    if (info.file.status === 'done') {
      // Get this url from response in real world.
      getBase64(info.file.originFileObj, imageUrl =>
        this.setState({
          imageUrl,
          loading: false,
        }),
      );
    }
  };

  render() {
    const uploadButton = (
      <div>
        {this.state.loading ? <LoadingOutlined /> : <PlusOutlined />}
        <div className="ant-upload-text">Upload</div>
      </div>
    );
    const { imageUrl } = this.state;
    return (
      <Upload
      	//传输属性名,默认已post传输
        name="avatar"
        listType="picture-card"
        className="avatar-uploader"
        showUploadList={false}
        //服务器接口
        action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
        //上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传。
        //支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传,resolve 时开始上传
        //( resolve 传入 File 或 Blob 对象则上传 resolve 传入对象)。
        //注意:IE9 不支持该方法。
        beforeUpload={beforeUpload}
        //上传中、完成、失败都会调用这个函数。
        onChange={this.handleChange}
      >
        {imageUrl ? <img src={imageUrl} alt="avatar" style={{ width: '100%' }} /> : uploadButton}
      </Upload>
    );
  }
}

ReactDOM.render(<Avatar />, mountNode);

1.FileReader

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

其中File对象可以是来自用户在一个元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。

重要提示: FileReader仅用于以安全的方式从用户(远程)系统读取文件内容 它不能用于从文件系统中按路径名简单地读取文件。 要在JavaScript中按路径名读取文件,应使用标准Ajax解决方案进行服务器端文件读取,如果读取跨域,则使用CORS权限。

1) 属性
FileReader.error 只读

一个DOMException,表示在读取文件时发生的错误 。

FileReader.readyState 只读

表示FileReader状态的数字。取值如下:

常量名描述
EMPTY0还没有加载任何数据.
LOADING1数据正在被加载.
DONE2已完成全部的读取请求.
FileReader.result 只读

文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。

2)事件处理
FileReader.onabort

处理abort事件。该事件在读取操作被中断时触发。

FileReader.onerror

处理error事件。该事件在读取操作发生错误时触发。

FileReader.onload

处理load事件。该事件在读取操作完成时触发。

FileReader.onloadstart

处理loadstart事件。该事件在读取操作开始时触发。

FileReader.onloadend

处理loadend事件。该事件在读取操作结束时(要么成功,要么失败)触发。

FileReader.onprogress

处理progress事件。该事件在读取Blob时触发。

3)方法
FileReader.abort()

中止读取操作。在返回时,readyState属性为DONE。

FileReader.readAsArrayBuffer()

开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.

FileReader.readAsBinaryString()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。

FileReader.readAsDataURL()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。

FileReader.readAsText()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值