您好!欢迎访问家园网-www.jy.wang!

家园网

详细分步骤讲解下面Plupload插件中的上传成功时的代码

网络 作者:本站 点击:

请详细分步骤讲解下面Plupload插件中的上传成功时的代码:

 FileUploaded: function(up, file, info) { //文件上传成功的时候触发
                showPhotoUploadBox($('#btn'));
                var uploaded_length = $(".img_common").length;
                if (uploaded_length <= upload_total) {
                    var data = eval("(" + info.response + ")");//解析返回的json数据
                    $("#" + file.id).html("<input type='hidden'name='pic[]' value='" 
                    + data.pic + "'/><input type='hidden'name='pic_name[]' value='" 
                    + data.name + "'/>\n\<img class='img_common' src='" 
                    + data.pic + "'/><span class='picbg'></span>
                    + <a class='pic_close' onclick=delPic('" 
                    + data.pic + "','" 
                    + file.id + "')></a>");
                }
                showUploadBtn();
            },


1. 事件触发与参数解析

  • 触发条件‌:当文件上传完成且服务器返回成功响应时自动执行。

  • 参数说明‌:

    • up:Plupload实例对象,用于管理上传队列。

    • file:当前上传成功的文件对象,包含id等属性。

    • info:服务器返回的原始响应数据(JSON字符串)。

2. 核心操作步骤

步骤1:UI状态重置

  • showPhotoUploadBox($('#btn')):重新显示上传按钮(假设隐藏后需恢复)。

  • showUploadBtn():重置上传按钮状态(如禁用/启用切换)。

步骤2:响应数据解析

  • var data = eval("(" + info.response + ")");

    • 将JSON字符串解析为JavaScript对象(需注意eval安全性问题,建议改用JSON.parse)。

    • 预期data结构:{ pic: "url", name: "filename" }

步骤3:DOM动态更新

  • 隐藏字段注入‌:

<input type='hidden' name='pic[]' value='data.pic' />
<input type='hidden' name='pic_name[]' value='data.name' />
    • 用于表单提交时传递文件路径和名称。

  • 图片预览生成‌:

<img class='img_common' src='data.pic' />
<span class='picbg'></span>
<a class='pic_close' onclick='delPic(data.pic, file.id)'>×</a>


上面代码这句是什么意思?

var uploaded_length = $(".img_common").length;


代码功能解析

1. ‌作用说明

  • 该代码用于统计当前页面中所有具有img_common类的图片元素的数量。

  • 典型应用场景:在上传成功时检查已上传图片总数是否达到限制(如upload_total定义的最大上传数量)。

2. ‌执行逻辑

  • $(".img_common"):通过jQuery选择器选中所有类名为img_common<img>元素。

  • .length:获取匹配元素的数量,即已成功上传并显示的图片总数。

3. ‌上下文关联

  • 在前述FileUploaded事件中,此代码用于控制是否允许继续上传:

if (uploaded_length <= upload_total) { ... }
    • 若已上传图片数未达到上限,则执行后续的DOM更新操作(如插入新图片预览)。

    • 否则跳过操作,防止超过限制。


注意事项

  • 动态性要求‌:需确保img_common类仅由新上传的图片添加,避免重复统计。

  • 性能优化‌:频繁操作DOM时,建议先缓存结果(如var $imgs = $(".img_common");)。

  • 替代方案‌:现代开发中可使用document.querySelectorAll()替代jQuery:

var uploaded_length = document.querySelectorAll(".img_common").length;

扩展应用

  • 进度反馈‌:结合upload_total计算剩余可上传数量:

var remaining = upload_total - uploaded_length;
console.log(`剩余可上传数量:${remaining}`);


上面说的这句var data = eval("(" + info.response + ")");

//解析返回的json数据,那么是如何解析的呢?能不能举个例子形象说明下

这行代码的核心作用是将服务器返回的JSON字符串转换为JavaScript对象,其解析过程可分为以下步骤:

1. 字符串包裹原理

  • 原始JSON字符串‌:假设服务器返回info.response为字符串'{"pic":"1.jpg","name":"test"}'

  • 强制表达式转换‌:通过拼接()使其变为'({"pic":"1.jpg","name":"test"})',目的是让eval将其识别为对象字面量而非代码块

    • 若直接eval('{}')会返回undefined(被当作空语句块)

    • eval('({})')返回[object Object](强制解析为对象)

2. 解析过程示例

// 模拟服务器返回的JSON字符串
var jsonString = '{"pic":"1.jpg","name":"test"}';
// 错误方式:直接eval会报语法错误
try {
  var wrongData = eval(jsonString); // 抛出异常
} catch(e) {
  console.log("直接eval报错:", e.message); 
}
// 正确方式:包裹圆括号
var data = eval("(" + jsonString + ")");
console.log(data.pic); // 输出: "1.jpg"
console.log(data.name); // 输出: "test"

接着讲解


















JSON字符串解析原理与示例

1. 原始JSON字符串结构

假设服务器返回的响应数据为:

{"pic":"1.jpg","name":"test"}

此时info.response是字符串类型:
'{"pic":"1.jpg","name":"test"}'(注意单引号包裹)

2. 解析过程拆解

  • 步骤1:包裹圆括号
    通过拼接()将字符串转换为表达式形式:
    '({"pic":"1.jpg","name":"test"})'
    强制让eval将其识别为对象字面量而非代码块2

  • 步骤2:执行eval解析
    eval执行后返回JavaScript对象:

{
  pic: "1.jpg",
  name: "test"
}

3. 对比直接eval的差异

  • 错误方式‌:直接解析会报错或返回undefined

eval('{}');      // 返回 undefined(被当作空语句块)
eval('{"a":1}


继续讲解


我来用一个形象的比喻和具体例子说明这个JSON解析过程:

  1. 原始数据‌:假设服务器返回的字符串是 '{"name":"小明","age":18}',这就像一封用绳子捆起来的信(字符串格式)

  2. 加括号‌:"(" + info.response + ")" 变成 '({"name":"小明","age":18})',相当于给信加了个"拆信工具"(括号)

  3. eval执行‌:

    • 不加括号时:eval('{}') 像收到一个空盒子(返回undefined)

    • 加了括号:eval('({})') 像收到一个明确标记"请拆开"的盒子

  4. 实际例子‌:

// 服务器返回的字符串
var serverResponse = '{"product":"手机","price":2999}';
// 安全解析方式(现代推荐)
var safeData = JSON.parse(serverResponse);
console.log(safeData.product); // 输出"手机"
// 传统eval方式(有风险)
var riskyData = eval("(" + serverResponse + ")");
console.log(riskyData.price); // 输出2999

关键区别:

  • eval会把字符串当代码执行,可能执行恶意代码

  • JSON.parse专门解析JSON,更安全快速

  • 括号的作用是让eval明确知道要解析的是对象而非代码块



上面的这个+ info.response +是什么意思?为什么带2个加号?干什么的


在JavaScript字符串拼接中,+ info.response + 的语法结构解析如下:

1. 加号的核心作用

两个加号用于字符串拼接,将变量info.response嵌入到目标字符串中。例如:

"(" + info.response + ")"

等效于模板字符串:

`(${info.response})`

2. 具体执行流程

  • 步骤1‌:将开括号(转为字符串

  • 步骤2‌:拼接info.response(服务器返回的JSON字符串)

  • 步骤3‌:拼接闭括号)
    最终生成可被eval解析的表达式字符串,如({"name":"test"})

3. 必要性说明

  • 强制对象解析‌:单独使用eval(info.response)可能被误认为代码块,包裹括号后明确指示解析为对象字面量

  • 旧环境兼容‌:在ES5之前替代JSON.parse()的方案

4. 现代替代方案

推荐使用更安全的JSON.parse()直接解析JSON字符串:

var data = JSON.parse(info.response);  // 无XSS风险:ml-citation{ref="1,3" data="citationList"}


能举个使用"info.response"的实例吗?


以下是使用info.response处理服务器响应的典型实例,结合不同技术场景说明:

1. XMLHttpRequest 响应处理

xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var info = { response: xhr.responseText }; // 模拟Plupload的info对象
    var data = JSON.parse(info.response);      // 解析JSON响应
    console.log(data.product);                 // 输出服务器返回的产品名
  }
};

说明‌:通过xhr.responseText获取原始响应后,需解析为JSON对象使用1

2. Plupload 文件上传成功回调

FileUploaded: function(up, file, info) {
  var response = JSON.parse(info.response);    // 解析服务器返回的JSON
  $("#result").append(`
    <div>文件名: ${response.name}</div>
    <div>文件路径: <img src="${response.url}"></div>
  `);
}

说明‌:上传完成后,info.response包含服务器返回的文件信息,需解析后更新DOM

3. Fetch API 响应克隆

fetch('/api/data').then(res => {
  const info = { response: res.clone().json() }; // 克隆响应体避免锁定
  return info.response;
}).then(data => {
  console.log(data); // 使用解析后的数据
});

说明‌:Fetch API需通过clone()处理响应流,再转换为JSON

关键区别总结

场景数据获取方式解析方法
XMLHttpRequestxhr.responseTextJSON.parse()
Pluploadinfo.responseeval("("+str+")")*
Fetch APIres.json()自动解析Promise

*注:Plupload旧版示例中使用eval解析,现代实现应优先用JSON.parse()


如何在Plupload中使用"info.response"?


在Plupload中,info.response用于获取服务器返回的响应数据,通常用于文件上传成功后的回调处理。以下是具体使用方法及示例:


1. 基本用法

FileUploaded事件中,info.response包含服务器返回的原始响应数据(通常是JSON字符串)。通过解析该数据,可以获取上传结果信息(如文件路径、文件名等)25

FileUploaded: function(up, file, info) {
  var data = JSON.parse(info.response); // 解析JSON响应
  console.log("文件URL:", data.url);    // 输出服务器返回的文件路径
}

2. 完整示例

前端配置(Plupload初始化)

var uploader = new plupload.Uploader({
  browse_button: 'upload-btn',
  url: '/upload',
  filters: { max_file_size: '10mb' },
  init: {
    FileUploaded: function(up, file, info) {
      var response = JSON.parse(info.response);
      if (response.success) {
        // 显示上传成功的文件
        $('#preview').html(`<img src="${response.url}">`);
      } else {
        alert("上传失败: " + response.error);
      }
    }
  }
});
uploader.init();

后端响应格式(示例)

服务器应返回标准JSON,例如:

{
  "success": true,
  "url": "/uploads/1.jpg",
  "name": "example.jpg"
}

3. 注意事项

  • 安全解析‌:优先使用JSON.parse(info.response)替代eval,避免XSS风险

  • 错误处理‌:检查响应中的状态字段(如success),处理上传失败情况

  • 多文件场景‌:通过file.id关联特定文件的DOM元素,实现精准更新


4. 高级应用

  • 分片上传‌:在ChunkUploaded事件中,info.response可获取分片上传的中间响应

  • 自定义头信息‌:通过headers参数传递额外数据(如认证令牌),并在响应中返回

通过合理使用info.response,可实现文件上传后的动态预览、错误反馈等功能

标签: