2010-12-17 61 views
1

我試圖讓一個EXTJS應用程序發送附件的電子郵件。所以我有一個非常基本的形式,包括主題的文本字段,另一個帶有inputType的文本字段:用於附件的「文件」以及一個html編輯器。EXTJS Fileupload - IE8安全欄問題

var panel = new Ext.form.FormPanel({ 
    fileUpload:true, 
    labelAlign: 'right',   
    monitorValid: true, 
    border: false, 
    bodyBorder: false,  
    defaults:{ 
     anchor: '100%', 
     labelStyle: 'font-weight:bold;' 
    }, 
    items: [ 
     { 
      xtype: 'textfield', 
      fieldLabel: 'SUBJECT', 
      name: 'subject', 
      allowBlank: false 
     }, 
     { 
      xtype: 'textfield', 
      fieldLabel: 'ATTACHMENT', 
      name: 'file_to_upload', 
      anchor: '80%', 
      itemCls: 'attachment-field', 
      allowBlank: true, 
      inputType:'file' 
     }, 
     { 
      xtype: 'htmleditor', 
      fieldLabel:'MESSAGE', 
      name:'msg' 
     } 
    ] 
}); 

這種形式被放置在一個窗口,這將提交給服務器:當我提交表單使用FF服務器

var window = new Ext.Window({ 
    title: 'Compose a message', 
    height: 600, 
    width: 800, 
    autoScroll: true, 
    border: false, 
    bodyBorder: false,   
    items: panel, 
    buttons:[ 
     { 
      text: 'Send', 
      formBind: true, 
      handler: function() { 
       panel.getForm().submit({ 
        url: *Call to the server*, 
        method : 'POST', 
        timeout: 300000, // 5min 
        waitMsg: 'Please wait while we send your email',       
        success :function(form, action) { 
         window.close(); 
        }             
       }); 
      } 
     }, 
     { 
      text: 'Close', 
      handler: function() { 
       window.close(); 
      } 
     } 
    ] 
}); 

而且一切都很正常。但IE8出現問題。 IE瀏覽器顯示安全欄說我試圖將文件下載到計算機,這與我正在做的(我正在上傳文件)完全相反!

如何防止觸發此安全欄?

--edit 2010年12月18日16:48 EST-- 是否有可能,它可以由此引起:(從EXTJS basicForm正在添加的文檔),使用正常,不進行

文件上傳'Ajax'技術,也就是說它們不是使用XMLHttpRequests來執行的。相反,表單是以標準方式提交的,並且臨時修改了DOM元素,以便將其目標集設置爲引用動態生成的隱藏,將其插入到文檔中,但在收集返回數據後將其刪除。服務器響應由瀏覽器分析以創建IFRAME的文檔。如果服務器使用JSON發送返回對象,則必須將Content-Type標頭設置爲「text/html」,以便通知瀏覽器將文本原樣插入文檔主體。對於HTML解析器來說重要的字符必須作爲HTML實體發送,因此將「<」編碼爲「<」,「&」,如「&」等。從文檔中檢索響應文本,並創建假的XMLHttpRequest對象包含responseText屬性以符合事件處理程序和回調的要求。請注意,文件上傳數據包是通過內容類型multipart/form發送的,某些服務器技術(特別是JEE)可能需要一些自定義處理才能從數據包內容中檢索參數名稱和參數值。

我不認爲我瞭解那裏的解釋一切......

- 編輯完 -

感謝 阿蘭

回答

2

這是Ext寫入文檔的內容。

<iframe id="ext-gen170" name="ext-gen170" class="x-hidden" src="about:blank"><html><head></head><body></body></html></iframe> 

這個問題可以通過設置一個有效的https src路徑來解決,例如,https://yousite.com/blank.html

我還沒有找到如何修改src。任何幫助將受到歡迎

+0

設置src不起作用,但它通過將響應內容類型設置爲文本\ html – Ameya 2014-12-02 06:12:53

6

在服務器端,你必須做的以下即使看起來有點奇怪:

  • 將響應類型設置爲「text/html」
  • 發送{「成功」:真正}作爲JSON對象

響應類型,使瀏覽器呈現在iframe響應ExtJS的使用 ExtJS的讀取從DOM,並且解釋爲JSON,尋找成功領域。

+0

謝謝,但這正是我正在做的。我重新驗證了並且我的服務器產生了:@Produces(value = {「application/json」,「text/html」})並且我返回一個帶有「succes」的hashmap:true。奇怪的是,它在FF中完美工作... – Alain 2010-12-18 22:11:45

+0

如果你拿出「application/json」的東西呢? – 2010-12-19 08:59:10

+1

我對你的答案投了一票,因爲它解決了問題的一部分。如果應用程序/ json不在那裏,它會產生真正的區別。 IE不再彈出安全消息。 – Alain 2011-02-15 05:48:15

1

我相信ExtJS的是這樣做的:

if(Ext.isIE) { 
     frame.src = Ext.SSL_SECURE_URL; 
    } 

如果該字符串被定義爲:

/** 
    * URL to a blank file used by Ext when in secure mode for iframe src and onReady src to prevent 
    * the IE insecure content warning (<tt>'about:blank'</tt>, except for IE in secure mode, which is <tt>'javascript:""'</tt>). 
    * @type String 
    */ 
    SSL_SECURE_URL : isSecure && isIE ? 'javascript:""' : 'about:blank', 

...和的isSecure是:

isSecure = /^https/i.test(window.location.protocol); 

這就是你的about:blank來自何處。 如果這不起作用,這聽起來像你需要將該URL設置爲適合你的東西(或者可能isSecure的值正在發揮作用)。

0

按照你的建議和許多測試,這是我做的。在將我的https應用程序中的extall庫包含到空白圖像後,我剛分配SSL_SECURE_URL常量。

Ext.SSL_SECURE_URL = 'https://mysite.com/blank.gif'; 

沒問題了。

非常感謝。