4

そのため、バックボーン モデルからの通常の POST (作成) 要求と共に画像をアップロードする方法の完全な例を見つけようと、ネットを 1 日トロールしてきました。そのため、最初に掘り下げた後FileReader、HTML5のAPIを発見しました-いくつかのテストの後、これを作成することでバックボーンの外でうまく機能しました XMLHttpRequest()

現在解決しようとしている問題は、通常のマルチパート フォーム ワークフローで経験するように、Bacbone に POST 要求と共に FILES データを送信させる方法です。私はバックボーンにかなり慣れていないので、明らかなエラーを許してください。ここに私がこれまでに持っているものがあります。

モデル

define(                                                                                                                                                
    [                                                                                                                                                  
        'backbone'                                                                                                                                     
    ],                                                                                                                                                 

    function (Backbone) {                                                                                                                              
        var Mock = Backbone.Model.extend({                                                                                                             
            url: '/api/v1/mocks',                                                                                                                      
            idAttribute: '_id',                                                                                                                        

            readFile: function(file){                                                                                                                  
                var reader = new FileReader();                                                                                                         
                self = this;                                                                                                                           

                reader.onload = (function(mockFile){                                                                                                   
                    return function(e){                                                                                                                
                        self.set({filename: mockFile.name, data: e.target.result});                                                                    
                    };                                                                                                                                 
                })(file);                                                                                                                              

                reader.readAsDataURL(file);                                                                                                            
            }                                                                                                                                          
        });                                                                                                                                            

        return Mock;                                                                                                                                   
    }                                                                                                                                                  
);

見る

define(
    [
        'jquery',
        'backbone',
        'underscore',
        'text!../templates/create_mock-template.html',
        'models/mock',
        'collections/mocks'
    ],

    function ($, Backbone, _, createMockTemplate, Mock, mocksCollection) {
        var CreateMockView = Backbone.View.extend({
            template: _.template(createMockTemplate),

            events: {
                'submit form': 'onFormSubmit',
                'click #upload-link': 'process',
                'change #upload': 'displayUploads'
            },

            initialize: function () {
                this.render();
                return this;
            },

            render: function () {
                this.$el.html(this.template);
            },

                        process: function(e){
                                var input = $('#upload');
                                if(input){
                                        input.click();
                                }
                                e.preventDefault();
                        },

                        displayUploads: function(e){
                                // Once a user selects some files the 'change' event is triggered (and this listener function is executed)
                                // We can access selected files via 'this.files' property object.

                                var formdata = new FormData();
                                var img, reader, file;
                                var self = this;

                                for (var i = 0, len = e.target.files.length; i < len; i++) {
                                        file = e.target.files[i];

                                        if (!!file.type.match(/image.*/)) {
                                                if (window.FileReader) {
                                                        reader = new FileReader();
                                                        reader.onloadend = function (e) { 
                                                                self.createImage(e.target.result, e);
                                                        };
                                                        self.file = file;
                                                        reader.readAsDataURL(file);
                                                }
                                        }   
                                }
                        },

                        createImage: function(source, fileobj) {
                                var image = '<img src="'+source+'" class="thumbnail" width="200" height="200" />'
                                this.$el.append(image);
                        },

            onFormSubmit: function (e) {
                e.preventDefault();

                // loop through form elements
                var fields = $(e.target).find('input[type=text], textarea');
                var data = {};

                // add names and vlaues to data object
                $(fields).each(function(i, f) {
                    data[$(f).attr('name')] = $(f).attr('value');
                }); 

                // create new model from data
                var mock = new Mock(data);

                // this should set the filename and data attributes on the model???
                mock.readFile(this.file);

                // save to the server
                mock.save(null, {
                    wait: true,
                    error: function(model, response) {
                        console.log(model)
                    },
                    success: function(model, response) {
                        mocksCollection.add(model);
                        console.log(model, response);
                    }
                });
            },
        });

        return CreateMockView;
    }
);

私はこれがすべて少し手を振っているかもしれませんが、何よりも概念の証明であり、バックボーンも学ぶ良い機会であることを心から感謝しています. だから私の質問の核心はこれです

  • リクエストがバックボーンから API に送信されると、node/express サーバーへのリクエストにデータとファイル名の属性が表示されないのはなぜですか
  • 私がやろうとしていることは可能ですか?基本的には、データ属性を読み取ってサーバー上で作成およびイメージできると思いましたか?
  • モック モデルで同期メソッドをオーバーライドし、POST と FILES が正しく設定された適切な形式のリクエストを作成する方法はありますか。

これは可能だと確信していますが、耕してこれを機能させるために必要な情報を見つけることができないようです.!

誰かが助けてくれることを願っています!

乾杯

編集

私の理解と、ドキュメント クラウドの IRC チャンネルでの簡単なチャットにより、もう少し情報を提供したかっただけです。だから私が電話するとき

mock.readFile(this.file)

fileName および data 属性が設定されていないようです。実際、ここのコンソールログは起動していないように見えるので、これが問題である可能性があると推測しています. データとファイル名の値に基づいて、基本的にノードの端にイメージを構築するこのアプローチに満足しています。では、なぜこれらのプロパティが設定され、ポスト リクエストで API に渡されないのでしょうか?

4

2 に答える 2

3

モデルの作成を 2 つのステップに分割することで、この状況を解決しました。

  1. 基本情報
  2. 資産

たとえば、モデルFilmの場合、 titlesynopsisのみを含むcreate-formを表示します。この情報はサーバーに送信され、モデルが作成されます。次のステップでは、更新フォームを表示できます。これで、次のようなファイル アップロードプラグインを使用するのが非常に簡単になりました。

  • jQuery File Upload非常にプロフェッショナルで安定した
  • BBAssetsUpload非常にベータ版ですが、バックボーンに基づいており、プログラマーを知っていると言えます ;P

また、参照用のソース コードをチェックして、ファイル作成ソリューションを使用したワンステップ バックボーン モデルの実現を試みることもできます。

于 2012-08-27T12:28:19.117 に答える