2017-09-10 3 views
0

チャンクアップロードを送信することで、Cloudflareのアップロード上限100mbを回避しようとしています。しかし、実際にチャンクされたデータの送信を開始する方法はわかりません。サーバーに送信したい100個のブロブがあるとします。ストリームするのですか?どのようにして、サーバーは連続リクエストに互いに関連していると伝えますか?ここでjavascriptで配列をアップロードしてNode.jsで処理する

は、これまでの私のコードです:

getChunks(file) { 
    const divideBy = 1 * 1024 * 1024 
    const availableDivisions = Math.ceil(file.size/divideBy) 
    let currentSlice = 0 

    const chunks = Array(availableDivisions) 
    .fill() 
    .map((iteration, index) => { 
     const nextDivision = divideBy * (index + 1) 
     const chunk = file.slice(currentSlice, nextDivision, file.type) 

     currentSlice = nextDivision 

     return chunk 
    }) 

    return chunks 
} 

sendChunk(blob) { 
    return new Promise((resolve, reject) => { 
    const xhr = new XMLHttpRequest() 

    xhr.open('POST', 'http://localhost:4080/test', true) 
    xhr.setRequestHeader('Content-type', blob.type) 

    xhr.onreadystatechange =() => { 
     if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { 
     resolve() 
     } 
    } 

    xhr.send(blob) 
    }) 
} 

uploadChunked(file) { 
    const chunks = this.getChunks(file) 

    let iteration = 0 

    const upload = chunk => { 
    let nextIteration = iteration + 1 
    let nextChunk = chunks[nextIteration] 

    this.sendChunk(chunk).then(() => { 
     if (nextChunk) { 
     iteration = nextIteration 
     upload(nextChunk) 
     } 
    }) 
    } 

    upload(chunks[0]) 
} 

だから、これは正常に動作し、アップロード要求が正しく行われています。私の問題は、これらの連続したすべての要求が1つのファイルを参照していることをサーバーがどのように伝えるべきかを把握することです。私はオンラインで見てきましたが、私はこの部分で非常に混乱しています。

+0

私はこれを理解しているかどうかはわかりません。どういうわけか、サーバ側で100MBのファイルをたくさん連結しますか? – 82Tuskers

+0

アイデアは、1つのリクエストで100MB全体を送信する代わりに、パフォーマンスを向上させ、Cloudflareのようなアップロード制限を避けるために、より小さなチャンクを送信することです。 –

答えて

1

Tus protocol. 私のサーバーはチャンク(再開可能な)アップロードを受け付けることができ、Cloudflareは不平を言っていません。

+0

サーバー側では何を使用していますか? Cloudflareは箱からそれを守るのですか? – 82Tuskers

+0

私はあなたが何を求めているのか分かりません。 Cloudflareは何も賞賛していません。要求あたり100MBのアップロード制限があります。小さな塊で複数のリクエストにまたがってファイルを送信することで、Cloudflareはリクエストが大きすぎると不平を言うことはありません。 –

+0

Tusプロトコルを正しく使用していますか?クラウドフレアはどのようにそれを称えますか? – 82Tuskers

-1

できません。 100 MB(またはX MB)はリクエストごとの制限ではありません。

ファイルごとの制限です。つまり、それらをチャンクすると、各チャンクはサーバー上のファイルになります。

今のように複数のチャンクにアップロードすることができます。また、クライアント側で後でユーザーをステッチするのに役立つscriptも追加できます。

+0

あなたは私の質問を誤解しています。大きなファイルの小さなチャンクをサーバーに送信すると、サーバーは完了したら結合されます。 –

+0

@SebastianOlsen ajaxリクエストレベルでは、複数パートのアップロードなどができます。しかし、これは 'xhr.send'のペイロードを1つのファイルに併合します。したがって、チャンク(あなたがここで言及しているように)は、サーバの最後にあるファイルになるでしょう。それはあなたが今見ているものではありませんか? – 82Tuskers

+0

もう一度、私がしようとしていることを誤解しています。私はCloudflareを使用しているので、1回のリクエストで100MB以上のファイルをアップロードすることはできません。Cloudflareにはアップロード制限があります。だから代わりに、私はチャンクアップロードを行う必要があり、サーバー上のアップロードを追跡する方法があります。このようにして、要求ごとに小さなチャンクをサーバーに送信し、完了すると、サーバーはそれらを組み立てて次のステップを実行します。 –

関連する問題