开发者社区 问答 正文

HTML5 文件上传的两种方式

以前上传文件需要提交Form表单。
HTML5方式上传文件,可以通过使用FormData类模拟Form表单提交,从而实现无刷新上传文件。
假设有一个文件选择框


  
  • type="file" name="pic" id="pic" accept="image/gif" />

有下面两种方式上传文件:

1、XMLHttpRequest(有进度事件)


  
  • var files = document.getElementById('pic').files; //files是文件选择框选择的文件对象数组

  • if(files.length == 0) return;

  • var form = new FormData(),
  • url = 'http://.......', //服务器上传地址
  • file = files[0];
  • form.append('file', file);

  • var xhr = new XMLHttpRequest();
  • xhr.open("post", url, true);

  • //上传进度事件
  • xhr.upload.addEventListener("progress", function(result) {
  • if (result.lengthComputable) {
  • //上传进度
  • var percent = (result.loaded / result.total * 100).toFixed(2);
  • }
  • }, false);

  • xhr.addEventListener("readystatechange", function() {
  • var result = xhr;
  • if (result.status != 200) { //error
  • console.log('上传失败', result.status, result.statusText, result.response);
  • }
  • else if (result.readyState == 4) { //finished
  • console.log('上传成功', result);
  • }
  • });
  • xhr.send(form); //开始上传

2、Fetch API(目前不支持进度事件)


  
  • var form = new FormData(),
  • url = 'http://.......', //服务器上传地址
  • file = files[0];
  • form.append('file', file);

  • fetch(url, {
  • method: 'POST',
  • body: form
  • }).then(function(response) {
  • if (response.status >= 200 && response.status < 300) {
  • return response;
  • }
  • else {
  • var error = new Error(response.statusText);
  • error.response = response;
  • throw error;
  • }
  • }).then(function(resp) {
  • return resp.json();
  • }).then(function(respData) {
  • console.log('文件上传成功', respData);
  • }).catch(function(e) {
  • console.log('文件上传失败', e);
  • });

展开
收起
chenchuan 2018-08-31 22:52:57 2366 分享 版权
阿里云 AI 助理回答

在使用HTML5的FormData API进行文件上传时,您有两种主要方法:XMLHttpRequest和Fetch API。下面是如何根据您的需求选择并实施这两种方法的详细说明:

1. XMLHttpRequest方式上传

特点: - 支持进度事件:可以实时监控文件上传进度。 - 兼容性较好:适用于需要兼容较旧浏览器的场景。

实现步骤: 1. 获取文件对象:通过document.getElementById('pic').files获取用户选择的文件数组。 2. 创建FormData实例:var form = new FormData();。 3. 添加文件到表单数据:form.append('file', files[0]);。 4. 初始化XMLHttpRequest对象,并设置为异步模式。 5. 监听progress事件,用于显示上传进度。 6. 设置请求方法和URL,然后发送请求:xhr.send(form);。 7. 通过监听readystatechange事件处理响应,判断上传成功或失败。

2. Fetch API方式上传

特点: - 语法简洁:相比XMLHttpRequest,代码更简洁易读。 - 不支持原生进度事件:但可以通过其他手段(如Stream API结合AbortController)间接实现进度跟踪,不过这通常较为复杂且不是所有浏览器都支持。 - 现代浏览器兼容性:适用于追求最新技术标准和用户体验的项目。

实现步骤: 1. 同样先获取文件对象并创建FormData实例。 2. 使用fetch(url, {method: 'POST', body: form})发起POST请求。 3. 链式调用.then()处理响应,注意检查response.status来判断操作是否成功。 4. 由于Fetch API本身不直接支持进度事件,如果需要进度指示,可能需要采用额外的技术方案或者考虑继续使用XMLHttpRequest。

注意事项

  • 选择策略:如果您需要显示上传进度,推荐使用XMLHttpRequest。若追求代码简洁性和现代浏览器体验,Fetch API是更好的选择,尽管需额外工作来实现进度跟踪。
  • 错误处理:无论哪种方法,都要确保有完善的错误处理逻辑,比如网络异常、服务器错误等。
  • 跨域问题:在跨域上传时,服务器端需要配置CORS(跨源资源共享),允许特定来源的请求。

综上所述,根据实际应用场景中对进度显示的需求、浏览器兼容性要求以及代码风格偏好,您可以灵活选择XMLHttpRequest或Fetch API来实现HTML5无刷新文件上传功能。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: