大文件切片的ajax问题

您那篇大文件分片上传代码我直接赋值粘贴了,但是我的ajax学的很薄弱,目前我们在开发视频转码的项目,只有我一个前端,没有后端,我的自行搭出来前面的架子,可是您文章里贴了一段requst需要自行更换自己封装的ajax,我如何能做以恶个模拟的文档来查看是否能实现呢

你这种提问内容怕是需要贴一下文章哦,或者直接去问写这篇的博主

试试前端ffmpeg
https://ffmpegwasm.netlify.app/

ajax如何切片处理视频大文件

可以借鉴下
https://blog.csdn.net/yjjatqihc/article/details/114531546

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
如果您想模拟大文件分片上传的过程,可以使用模拟数据的方式进行测试。具体来说,您可以编写一个模拟的后端接口,用于接收上传的文件片段并将其存储在服务器上。然后,您可以使用自己封装的 ajax 函数来模拟上传过程,并将文件片段发送到模拟的后端接口中。

以下是一个简单的示例,用于模拟后端接口:

// 模拟后端接口,用于接收上传的文件片段
app.post('/upload', function(req, res) {
  // 获取上传的文件片段,例如 req.body.chunk
  // 将文件片段存储在服务器上
  // 返回上传成功的消息,例如 res.send({ success: true })
});

在前端,您可以使用您自己封装的 ajax 函数来模拟上传过程,并将文件片段发送到模拟的后端接口中。以下是一个示例代码,用于发送文件片段:

// 模拟上传文件片段的函数
function uploadChunk(chunk, index, total, url, callback) {
  var formData = new FormData();
  formData.append('chunk', chunk);
  formData.append('index', index);
  formData.append('total', total);
  
  ajax({
    url: url,
    type: 'post',
    data: formData,
    processData: false,
    contentType: false,
    success: function(response) {
      callback(response);
    },
    error: function(xhr, status, error) {
      console.error(error);
    }
  });
}

// 测试代码
var file = document.getElementById('file').files[0];
var chunkSize = 1024 * 1024; // 每个文件片段的大小
var chunks = Math.ceil(file.size / chunkSize); // 文件片段的数量
var currentChunk = 0; // 当前上传的文件片段的索引

// 分片上传文件
while (currentChunk < chunks) {
  var start = currentChunk * chunkSize;
  var end = Math.min(start + chunkSize, file.size);
  var chunk = file.slice(start, end);

  uploadChunk(chunk, currentChunk, chunks, '/upload', function(response) {
    console.log(response);
  });

  currentChunk++;
}

在上面的代码中,我们使用了自己封装的 ajax 函数来发送文件片段。具体来说,我们将文件片段和其他必要的参数打包成 FormData 对象,并将其作为 data 参数传递给 ajax 函数。然后,我们将 processData 和 contentType 参数设置为 false,这样 jQuery 会自动识别我们传递的是 FormData 对象,并将其转换为正确的请求格式。最后,我们将 success 参数设置为一个回调函数,用于处理上传成功后的响应。

请注意,上面的示例代码中使用的是 jQuery 的 ajax 函数。如果您没有使用 jQuery,可以使用其他类似的 ajax 函数来替代。同时,您需要根据自己的后端接口来调整代码中的参数和请求格式。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
好的,下面是模拟的ajax代码:

function ajax(method, url, data, success){
    var xhr = null;
    if(window.XMLHttpRequest){
        xhr = new XMLHttpRequest();
    }else{ // 兼容低版本IE浏览器
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    if(method == 'get' && data){
        url += '?' + data;
    }
    xhr.open(method, url, true);
    if(method == 'get'){
        xhr.send();
    }else{
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
        xhr.send(data);
    }
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                success && success(xhr.responseText);
            }else{
                alert('出错了,Err:' + xhr.status);
            }
        }
    }
}

上面的ajax代码实现了基本的get/post请求,并将请求结果传递给success函数。

下面是修改后的大文件分片上传代码(修改了request为ajax):

var size = 2 * 1024 * 1024; // 2MB
var chunks = Math.ceil(file.size / size);
var currentChunk = 0;
var formData = new FormData();
var filehash = null;
var totalSize = file.size;
var startTime = Date.now();

// 生成文件hash值
function hashFile(file, callBack) {
    var chunkSize = 1024 * 1024,
        chunks = Math.ceil(file.size / chunkSize),
        currentChunk = 0,
        spark = new SparkMD5.ArrayBuffer(),
        fileReader = new FileReader();

    fileReader.onload = function (e) {
        spark.append(e.target.result);
        currentChunk++;
        if (currentChunk < chunks) {
            loadNext();
        } else {
            callBack && callBack(spark.end());
        }
    };

    function loadNext() {
        var start = currentChunk * chunkSize,
            end = start + chunkSize >= file.size ? file.size : start + chunkSize;
        fileReader.readAsArrayBuffer(file.slice(start, end));
    }

    loadNext();
}

hashFile(file, function (res) {
    filehash = res;
    ajax('get', '/checkfile', 'filehash=' + filehash + '&total=' + totalSize, function (res) {
        if (res == 'true') {
            alert('秒传成功');
        } else {
            uploadChunk();
        }
    });
});

// 切片上传
function uploadChunk() {
    var fileChunk = file.slice(currentChunk * size, (currentChunk + 1) * size);
    formData.append('file', fileChunk);
    formData.append('currentChunk', currentChunk);
    formData.append('chunks', chunks);
    formData.append('size', size);
    formData.append('filehash', filehash);
    ajax('post', '/upload', formData, function (res) {
        currentChunk++;
        if (currentChunk < chunks) {
            uploadChunk();
        } else {
            console.log('上传完成,总共用时:' + (Date.now() - startTime) / 1000 + '秒');
        }
    });
}

在最后,我们需要更改上传时的url、get请求中的url和post请求需要上传的formData数据。

需要注意的是,formData.append中的key必须与接口中的参数名一致。如果你的接口需要上传的参数有其他类型数据,可以自行添加或修改。
如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

您好,我理解您的问题。要模拟实现大文件分片上传,您需要:

  1. 前端实现文件选择和切片。可以参考我文章中的前端代码,选择文件后用FileReader读取并切片。
  2. 模拟后端上传接口。可以在前端直接定义一个上传接口函数,在这个函数内部使用setTimeout模拟上传时间,并返回成功或失败信息。
  3. 在上传接口函数内部,保存切片数据。可以在本地存储,也可以上传到对象存储服务如七牛或阿里云OSS。
  4. 上传完成后,拼接所有切片。如果保存到本地,直接读取数据拼接;如果上传到对象存储,需要重新下载数据进行拼接。

所以您需要在前端实现以下逻辑:

  1. 文件选择事件:
js
fileInput.addEventListener('change', () => {
  const file = fileInput.files[0]
  // 调用文件切片方法
}) 

  1. 文件切片方法:参考文章代码,使用FileReader切片。

  2. 定义上传接口函数:

js
function uploadSlice(slice) {
  // 使用setTimeout模拟上传时间
  setTimeout(() => {
    // 随机返回成功或失败
    const success = Math.random() > 0.2
    if (success) {
      // 上传成功,保存切片数据
    } else {
      // 上传失败,进行重试
    }
  }, 1000)  // 1秒上传时间
}

  1. 保存切片数据:如果模拟对象存储,可以在本地定义一个对象,调用:
js
oss.put('slice_1', slice1) 

来模拟上传

  1. 全部上传完成,调用拼接方法,读取本地对象存储的数据拼接。

这就是一个简单的前端模拟大文件分片上传的方案。重点是模拟后端上传接口和保存切片数据。一步步实现这个流程,可以较好地理解大文件分片上传的原理。如果在实现中遇到问题,也请在CSDN提出,我会继续提供帮助。

希望这个方案能够帮助您模拟实现大文件分片上传,加深对该功能的理解。如果您有任何其他问题,也欢迎提出,我很乐意解答和讨论。