2017-06-10 30 views
1

golangのデフォルトnet/httpパッケージを使用して作成したサーバに大きなファイルをアップロードすると、デバッグが難しくなります。アップロードのコードは次のようになります。golang net/http大容量ファイルをアップロード中、定義されていないエラー

var server = &http.Server{ 
    Addr:   ":" + Configuration.Port, 
    ReadTimeout: 300 * time.Second, 
    WriteTimeout: 300 * time.Second, 
    ReadHeaderTimeout: 300 * time.Second, 
    MaxHeaderBytes: 500000000} 

http.HandleFunc("/upload/", uploadFile) 

server.ListenAndServe() 

最後に私が受け入れて、次のコード

func uploadFile(w http.ResponseWriter, r *http.Request) { 
    //Parsing the upload arguments into the values we shall be working with 
    r.ParseMultipartForm(5000000000000000) 

    file, _, err := r.FormFile("file") 
    //etc 
を使用してファイルを解析:

uploadForm.onsubmit =() => { 
     const formData = new FormData(uploadForm); 
     const isPublic : boolean = (<HTMLInputElement>document.getElementById('public_switch')).checked; 
     formData.append('file', (<HTMLInputElement>document.getElementById('file')).files[0]); 
     formData.append('compression', (<HTMLInputElement>document.getElementById('compression')).value); 
     formData.append('public', String(isPublic)); 
     const xhr = new XMLHttpRequest(); 
     xhr.open("POST", "/upload/"); 
     xhr.send(formData); 
     xhr.onreadystatechange = function() { 
      console.log(xhr.responseText); 
     } 
    } 

私は次のように私は開始golangで書かれたサーバーを持っています

非常に説明的なエラーメッセージ "multipart:NextPart:EOF"で、 'r.FormFile( "file")'でコード自体が失敗する

ファイルの制限やタイムアウトに何らかの設定がありますが、これはgoコードまたはjavascriptで設定されていない可能性がありますか?アップロードしようとしているファイルは〜1.7GBなので、httpでサポートされている制限内にはっきりと収まります。

FormFileを掘り下げたり、リクエスト自体をキャプチャしなくても、この問題をどのようにデバッグすることができますか?コードは小さなファイル(数Mb)でうまく動作します。

+0

「ReadTimeout」を「5分」に設定した後、タイムアウトする前に「1.7GB」ファイルを転送できますか? – Yadvendar

+0

転送開始から約10秒以内にエラーが表示されます。私はタイムアウトが問題だと思っていないので、私はちょうど5分でそれを外に出すように設定しました。 – George

+0

コンテンツがサーバーに送信されていないようです。サーバーを個別にテストします。 https://stackoverflow.com/a/33809474を見て試してみてください。 – jeevatkm

答えて

0

このような場合に備えて、私自身の質問に答えることができます。

JavaScriptの問題はあまりよくありません。私は、フォーム&のファイルのウェブAPIが本当にうまくいかないという事実と関係があると思います。

これは、私はjavascriptの側思い付いたソリューションです:本当に

const uploadFile = (form_id: string) => { 
    const uploadForm: HTMLFormElement = <HTMLFormElement>document.getElementById(form_id); 
    document.getElementById("submit_form").addEventListener("click", function(e) { 
     e.preventDefault() 

     let reader: FileReader = new FileReader(); 
     reader.readAsArrayBuffer((<HTMLInputElement>document.getElementById('file')).files[0]); 

     reader.onload = function(evt) { 

      const formData = new FormData(uploadForm); 
      const isPublic: boolean = (<HTMLInputElement>document.getElementById('public_switch')).checked; 
      formData.append('file', (<any>evt.target).result); 
      formData.append('compression', (<HTMLInputElement>document.getElementById('compression')).value); 
      formData.append('public', String(isPublic)); 
      const xhr = new XMLHttpRequest(); 
      xhr.open("POST", "/upload/"); 
      xhr.send(formData); 
      xhr.onreadystatechange = function() { 
       console.log(xhr.responseText + ' \n status is: ' + xhr.statusText); 
      } 

     }; 
    }); 

} 

非常にシンプルですが、すべてのオンラインの例は、たわごとと雑然としている典型的なjavasciptコミュニティの精神でいるのでそれを見つけるのに長い時間がかかりました。そして、その多くの他の非同期のWeb APIと同じように使用

let reader = new FileReader(); 
     reader.readAsArrayBuffer(dom_element_with_file_input.files[0]); 

reader.onload = function(e) { 
const your_file = e.target.result 
    } 

変数

大きなファイルの取り扱いは、基本的なと呼ばれるFileReaderのオブジェクトを使用して行われるべきです'your_file'は、ファイルで何をしたいのかに使用されます。私の場合、それは次のように行われているデータを形成するために追加された:

 reader.onload = function(e) { 
    const your_file = e.target.result 
const formData = new FormData(dom_element_of_type_form); 
formData.append('my_file', your_file); 
formData.append('other_stuff', 'a string with metadata'); 
     } 

私は実際にはそう、ファイルリーダーのAPIの明確な例で掲示期待して見つけることができませんでしたので、私は、一例として、これを残しています文字通り何百行ものコードが混乱しています。私がTにほとんど従った例はここにあるものです:

https://developer.mozilla.org/en-US/docs/Using_files_from_web_applicationsです。しかし、私はスピードの目的で代わりに 'readAsArrayBuffer'を使用しました。

最後に注意しておきたいのは、リーダーAPIが非常に遅く、多くのリソースを消費するということです。つまり、任意のファイルサイズでブラウザがクラッシュする可能性があります。私はchromioumでこの問題を抱えていました。ので、私は提案に公開されている、私はブラウザのクラッシュのための修正を見つける場合(またはそれらを正常に処理する方法)私は質問を更新し、その間に誰かが私の答えやブラウザのクラッシュを修正する方法を教えてください。

関連する問題