0

我正在尝试使用 resumable.js 和 laravel-chunk-upload 实现大文件上传。一切正常,即我能够正确上传大文件,但问题是,如果上传时网络连接发生任何问题,则上传无法正常完成。一大块得到错误。错误是:

    "message": "fopen(H:\\Codinoz\\Development\\File ECommerce\\digital-product-shopping\\storage\\app\\products/27-09-2021 CMF 20-21 before_166b6fa4934428d2952877c84bed0ef2.): Failed to open stream: Permission denied",

没有权限问题,因为在没有网络问题的情况下,同样的功能可以正常工作。

当前的javascript代码:

let browseFile = $('#browseFile');
let resumable = new Resumable({
    target: '{{ route('files.upload.large') }}',
    query:{_token:'{{ csrf_token() }}'} ,// CSRF token
    //fileType: ['mp4'],
    chunkSize: 10*1024*1024, // default is 1*1024*1024, this should be less than your maximum limit in php.ini
    headers: {
        'Accept' : 'application/json'
    },
    testChunks: false,
    maxChunkRetries: 1000,
    chunkRetryInterval: 2000,
    throttleProgressCallbacks: 1,
});

resumable.assignBrowse(browseFile[0]);

resumable.on('fileAdded', function (file) { // trigger when file picked
    showProgress();
    resumable.upload() // to actually start uploading.
});

resumable.on('fileProgress', function (file) { 
    if(navigator.onLine === true){
        // trigger when file progress update
        updateProgress(Math.floor(file.progress() * 100));
    }
    else{
        alert('no Internet');
    }        
});

resumable.on('fileSuccess', function (file, response) { // trigger when file upload complete
    response = JSON.parse(response)
    console.log('sss');
    //$('#videoPreview').attr('src', response.path);
});

resumable.on('fileError', function (file, response) { // trigger when there is any error        
        console.log(response);
});

let progress = $('.progress');
function showProgress() {
    progress.find('.progress-bar').css('width', '0%');
    progress.find('.progress-bar').html('0%');
    progress.find('.progress-bar').removeClass('bg-success');
    progress.show();
}

function updateProgress(value) {
    progress.find('.progress-bar').css('width', `${value}%`)
    progress.find('.progress-bar').html(`${value}%`)
}

function hideProgress() {
    progress.hide();
}

Laravel 服务端代码:

public function uploadLargeFiles(Request $request) {
    $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));

    if (!$receiver->isUploaded()) {
        // file not uploaded
    }

    $fileReceived = $receiver->receive(); // receive file
    if ($fileReceived->isFinished()) { // file uploading is complete / all chunks are uploaded
        $file = $fileReceived->getFile(); // get file
        $extension = $file->getClientOriginalExtension();
        $fileName = str_replace('.'.$extension, '', $file->getClientOriginalName()); //file name without extenstion
        $fileName .= '_' . md5(time()) . '.' . $extension; // a unique file name

        $disk = Storage::disk(config('filesystems.default'));
        $path = $disk->putFileAs('products', $file, $fileName);

        // delete chunked file
        unlink($file->getPathname());
        return [
            'path' => asset('storage/' . $path),
            'filename' => $fileName
        ];
    }

    // otherwise return percentage information
    $handler = $fileReceived->handler();
    return [
        'done' => $handler->getPercentageDone(),
        'status' => true
    ];
}

我是这方面的初学者,所以在寻找解决方案方面不太好。尽我所能,但找不到任何解决方案。如果您能提供帮助,那就太好了。

谢谢..

4

0 回答 0