如何用xmlhttprequest实现大文件上传和断点续传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用xmlhttprequest实现大文件上传和断点续传相关的知识,希望对你有一定的参考价值。

参考技术A H5支持XMLHttpRequest对象,能够实现断店续传。我说一下我的思路吧:首先获取文件的MD5(spark-md5.js),然后利用文件对象的slice方法进行切割文件,分段上传到后台,后台组装文件然后校验MD5值;我也刚好在做,觉得可行本回答被提问者采纳

如何用惯性js和laravel 8.0上传文件

【中文标题】如何用惯性js和laravel 8.0上传文件【英文标题】:How to upload files with inertia js and laravel 8.0 【发布时间】:2021-01-23 20:26:50 【问题描述】:

我有一个更新(补丁形式),它可以包含一些基本字段,其中包含一个特色图像和一组图库图像。

updatePhotoPreview(event) 
   this.featuredImagePreview = URL.createObjectURL(event.target.files[0])
   this.updateProductForm.featured_image = event.target.files[0]
,

在发送请求之前,甚至在请求头中,特色图片都是文件和二进制。

然后我只是用this.form.patch(url) 发布表单。

我收到一个错误,特色图片必须是图片。

我已经转储了请求,并且不知何故我的 features_image 值已将 设置为一个空数组。

画廊图片也是如此,它已经变成了一个空数组的数组。

我试过改路由post,put,结果还是一样,我加了自定义header

  headers: 'Content-Type': 'multipart/form-data' 

结果是一样的。

但相同的表单正在使用 POST 方法创建此资源的端点。 我已经删除了所有请求类并使用request()->all()转储

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

可以按照以下步骤通过 InertiaJS 和 Laravel 8 上传照片:

    在我们的 VueJS 组件的HTML:
<input type="file" class="hidden"
             ref="photo"
             @change="updatePreview">
<div v-show="preview">
  <span class="block w-20 h-20 rounded-full"
        :style="'width: 5rem; height: 5rem; border-radius: 999px; display: block; background-size: cover; background-repeat: no-repeat; background-position: center center; background-image: url(\'' + photoPreview + '\');'">
  </span>
</div>
    在我们的methods 对象中:
updatePhotoPreview() 
    const reader = new FileReader();

    reader.onload = (e) => 
        this.preview = e.target.result;
    ;

    reader.readAsDataURL(this.$refs.photo.files[0]);
,
storePhoto() 
    if (this.$refs.photo) 
        this.form.photo = this.$refs.photo.files[0]
    

    this.form.post(route('photo.store'), 
        preserveScroll: true
    );
,
    在我们的data 函数中:
data() 
   return 
       form: this.$inertia.form(
           '_method': 'PUT',
           photo: null,
       , 
           resetOnSuccess: false,
       ),
       preview: null,
   
,
    在我们的 Laravel 中 Controller:
class PhotoController 

    public function store(array $input)
    
        Validator::make($input, [
            'photo' => ['nullable', 'image', 'max:1024'],
        ]);

        if (isset($input['photo'])) 
           $photo->storePublicly();
        
    

【讨论】:

form.post 完美搭配,并将'_method': 'PUT' 添加到参数中。谢谢! 总是乐于帮助@MrEduar! :)【参考方案2】:

我通过在表单上添加“_method”并使用“发布”请求来解决此问题。

data() 
    return 
        form: this.$inertia.form(
            _method: "PUT",
        )
    ;
,
methods: 
    submit(form) 
        this.form
            .post("route/id", form, 
                preserveState: true
        )
    

【讨论】:

【参考方案3】:
var data = new FormData()
data.append('first_name', first_name || '')
data.append('last_name', last_name || '')
data.append('email', email || '')
data.append('password', password || '')
data.append('photo', photo || '')

Inertia.post('/users', data)

试试这个。只需使用 FormData() 实例化

请参考文档https://inertiajs.com/forms#file-uploads

【讨论】:

【参考方案4】:

使用表单数据

const fd = new FormData()

fd.append('file', this.form.file)

this.$inertia.post(route('file.register'), fd)

【讨论】:

以上是关于如何用xmlhttprequest实现大文件上传和断点续传的主要内容,如果未能解决你的问题,请参考以下文章

使用 XMLHttpRequest 上传大文件时的进度条

如何用JAVA实现加载一个文件?

前端之HTML利用XMLHttpRequest()和FormData()进行大文件分段上传

ASP.Net如何用FileUpLoad实现多文件上传

java上传成功后怎么触发其他操作

如何用ABAP代码实现上传本地excel文件,并将其作为附件发邮件