2017-04-17 5 views
7

Fable-ElmishとReact Helpersを使用してファイルをアップロードしようとしています。しかし、ファイルがFetchを使用してサーバーに送信できるものに選択されたときに、フォームイベントを変換する方法を考えることはできません。これは図である。Fable-Elmishを使用してReact.FormEventをBodyInitに変換します

R.input [ 
     ClassName "input-control" 
     Type "file" 
     OnChange (fun x -> FileUploaded x.target |> dispatch) 
    ] [] 

私の更新機能の対応する部分:

| FileUploaded file -> 
    model, Cmd.ofPromise postCsv file FetchSuccess FetchFailure 

フェッチでAPIを呼び出す関数:

let postData input = 
    let formData = FormData.Create() 
    formData.append("file.csv", input?files) 
    let defaultProps = 
     [ RequestProperties.Method HttpMethod.POST 
     ; RequestProperties.Body (formData |> unbox)] 
    promise { 
     return! Fable.PowerPack.Fetch.fetch ("/api/data") defaultProps 
    } 

どのように変換することができますすることができますReact.FormEventをBodyInitにインポートする必要がありますか?

答えて

1

私はFileList APIを正しく使用していませんでした。 postメソッドの作業ソリューションは次のとおりです。

let postData input = 
let formData = FormData.Create() 
formData.append("file.csv", input?files?item(0)) 
let defaultProps = 
    [ RequestProperties.Method HttpMethod.POST 
    ;RequestProperties.Headers [unbox EncType "multipart/form-data"] 
    ; RequestProperties.Body (formData |> unbox)] 
promise { 
    return! Fable.PowerPack.Fetch.fetch ("/api/data") defaultProps 
} 
4

新しいFormDataオブジェクトを作成し、それにファイルを追加する必要があります。

let formData = FormData.createNew formData.append("file", file.[0])

その後FORMDATAの代わりにファイルを渡すためにpostRecordにお電話を変更します。エンコードするにはフェッチが必要ですが、ファイルの生の配列を渡すだけです。

少なくとも、アップロードするファイルはfetch exampleです。また、ポストレコードは私には間違って見えます。使用できるポストメソッドはありますか? postRecordは、レコード型を予期していることを意味します。

+0

私はあなたの提案を考慮して、最新のコードを含めるように質問を更新しました。これは実際に投稿要求を行いますが、ファイルは含まれません。リクエストペイロードは次のようになります。------ WebKitFormBoundaryAkHYH5XIH8vT8kea コンテンツの処理:フォームデータ。名前: "file.csv" [オブジェクトFileList] ------ WebKitFormBoundaryAkHYH5XIH8vT8kea-- –

+0

パブリックフォルダでバンドルを検索し、生成されているコードを投稿してください。また、あなたがサーバーを含む小さなreproプロジェクトを投稿してくださいできる場合は、 Powerpackのフェッチ宣言のトラブルシューティングやパッ​​チ適用に使用できます。 –

+0

reproはこちらです:https://github.com/danoleary/FableFileUploadRepro –

1

私が思うFetch.postRecordはそれがapplication/jsonit should bemultipart/form-dataContent-Typeヘッダーを設定し、あなたの問題です。

パワーパックラッパーの代わりにraw fetch APIを使用する必要があります。like thisです。

1

コードをテストすると、ev.target?valueをチェックすると、イベントが選択したファイルの名前を取得するだけであることがわかりました。 postRecordは、jsonをエンドポイントに送信するために使用されているようです。あなたは、あなたがしたいことに移植:https://medium.com/ecmastack/uploading-files-with-react-js-and-node-js-e7e6b707f4efするつもりです。

関連する問題