2013-06-06 13 views
5

extjsにファイルをアップロードしようとしています。私にはモデルと店があります。ファイルのアップロードはウィンドウから発生し、私はウィンドウにフォームがありません。私がネットで試したすべての例は、form.submit()です。代わりに以下のようにAjaxを使用してデータをサーバーに送信します。extjs 4.2でのファイルのアップロードform.submit()なし

Ext.Ajax.request({ 

      url : 'qaf/saveSetupDetails.action', 

      params : { 
       'data' : recordsToSend 
      }, 
      failure : function(response){ 
       //console.log('error connecting controller'); 
      }, 
      success : function(response){ 
       //console.log('successfully submitted'); 
      } 
     }); 

データに送信するレコードは次のとおりです。

var store = Ext.getStore('SomeStore'); 
     var modifiedRecords = store.getModifiedRecords(); 
     var recordsToSend = []; 
     if(modifiedRecords.length > 0){ 
      Ext.each(modifiedRecords, function(record){ 
       recordsToSend.push(record.data);//I'm sure that this is so dump but this is how I do it for other records which are string and not sure how to do it for a file... 
      }); 
     } 
     Ext.USE_NATIVE_JSON = true; 
     recordsToSend = Ext.encode(recordsToSend); 

モデルのレコードを設定している間、私は以下のコードを使用して...

var rec = Ext.create('QAF.model.MyModel'); 
rec.set('modelField',Ext.getCmp('fileUploadCompID').value); 

私は応答"Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile]"

で500のステータスエラーを受け取った私は、これがあることを確信しています私がモデルに値を設定する方法のために、Ext.getCmp('fileUploadCompID').valueはファイル名を与えます。ファイルをモデルに設定する方法と、モデルのフィールドに指定するデータタイプを教えてください。

以下は、スプリングコントローラでファイルを取得する方法です。

@RequestMapping (value = "/qaf/saveSetupDetails.action") 
    public @ResponseBody 
    void saveSetupDetails(@RequestParam CommonsMultipartFile data)throws Exception{ 
     log.info("Enter into saveSetupDetails method..." + data.getOriginalFilename()); 
    } 

答えて

0

あなたはExtJSに

のFileFieldに

のExtJSのFileFieldにしてそれを行うことができない...私は私が間違ってやっている知っていると何がこの問題を解決するために行う必要があります選択ファイルから文字列urlを返します。 http://jsfiddle.net/e3M3e/e8V7g/

私はあなたのように選択したファイルが変更イベントで発生する必要があると思うが、FileFieldに、このイベント

あなたはこのソリューションを使用することができない持って、 は、多分あなたは、溶液から

例1つのアイデアを得ますそれでもHTML5 FileReaderを使用してAJAX呼び出しを通じてのExtJSのfileuploadfieldを使用してアップロードする場合

var itemFile = null; 
Ext.create('Ext.panel.Panel', { 
    title: 'Hello', 
    width: 400, 
    html: "<input id='inputFile' type='file' name='uploaded'/>", 
    renderTo: Ext.getBody(), 
    listeners: { 
     afterrender: function() { 
      itemFile = document.getElementById("inputFile");    
      itemFile.addEventListener('change', EventChange, false); 
     } 
    } 
}); 

function EventChange(e){  
    var files = itemFile.files; 
    console.log(files); 
} 
+0

こんにちは、私のデモを参照してください。応答遅れのために。私はこれをテストします.. – CARTIC

1

、あなたは、このようなようにそれを行うことができます。

launchUpload: function() { 
    //get a handle of the "file" input in the widget itself... 
    var fileInput = document.getElementById(yourUploadField.button.fileInputEl.id); 
    var fileReader = New FileReader(); 
    var fileToUpload = fileInput.files[0]; //assuming your only uploading one file... 
    var me = this 

    fileReader.onload = function (e) { 
     me.onLoadFile(e, me, fileToUpload.name); 
    } 

    fileReader.readAsDataURL(fileToUpload); 

}, 
onLoadFile: function (e, scope, filename) { 

    //I carry the scope around for functionality... 

    Ext.Ajax.request({ 
     method: 'POST', 
     url: 'url', 
     scope: scope, 
     jsonData: { fileNameParameter: filename, fileDatainBase64: e.target.result}, 
     success: function (response, operation) { 
      //success.. 
     }, 
     failure: function (response, operation) { 
      //failure... 
     } 
    });  

} 
0

ExtJSのバージョン6.0.1 - はい、あなたはAjaxといるFormDataのAPIを使用することができますインラインフレーム

Ext.define('xxx.yyy.UploadData', { 
    extend : 'Ext.form.Panel', 
    alias : 'widget.uploaddata', 

    initComponent : function(){   
     var me = this;   

     me.items = [{ 
      xtype  : 'filefield', 
      margin  : '20 0 0 20', 
      name  : 'excelfile', 
      fieldLabel : 'Choose file', 
      msgTarget : 'side', 
      allowBlank : false, 
      anchor  : '30%', 
      buttonText : 'Select', 
      defaultButtonTarget : 'fileframe' 
     },{ 
      xtype : 'panel', 
      html : '<iframe width="340" height="340" style="display: none" name="fileframe"></iframe>' 
     },{ 
      xtype : 'button', 
      text : 'Import', 
      handler : function(){ 
      var form = this.up('form').getForm(); 
      if(form.isValid()){ 
       form.submit({ 
        url  : './upload.php', 
        waitMsg : 'uploading...', 
        success : function(fp, o) { 
         alert("OK");        
        } 
       }); 
      } 
     } 
    }]; 

    me.callParent();   
    }  
    }); 
0

を使用する:

var file = s.fileInputEl.dom.files[0], 
    data = new FormData(); 
data.append('file', file); 
Ext.Ajax.request({ 
    url: '/upload/files', 
    rawData: data, 
    headers: {'Content-Type':null}, //to use content type of FormData 
    success: function(response){ 
    } 
}); 

申し訳ありません... here

関連する問題