2012-01-07 81 views
0

我HTTP發佈的XML文件到一個servlet,這是目前正在做:是否可以使用輸入流讀取http post值?

String xmlString = request.getParameter("xml"); 

我那麼XML字符串變量轉換爲StringReader和InputSource中的XML的SAX解析過程中。

parser.parse(new InputSource(new StringReader(xmlString))); 

我很好奇,如果我能以某種方式獲得作爲InputSource的價值開始?

表現很重要,如果我可以避免它,並且毫無理由地來回轉換事物似乎毫無意義。

+0

要傳遞XML內容作爲參數,而不是身體的一部分的任何正當理由嗎? – havexz 2012-01-07 22:05:37

+0

@havexz你是什麼意思? xml通過http post發佈到客戶端。 – Blankman 2012-01-07 22:10:46

+0

多數民衆贊成我所說的,爲什麼客戶端張貼它作爲參數,而不是作爲HTTP身體(參數下面)的一部分傳遞。像基於肥皂的發佈請求。 – havexz 2012-01-07 22:21:26

回答

4

如果你的XML是一個參數,你不能做太多。正如JB Nizet和skaffman指出的那樣,你不應該擔心。你只有一次在內存中的東西,你只執行一次讀。

但是如果XML是後身體本身,那麼你就可以閱讀:

parser.parse(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8"))); 
+0

請注意文件編碼,這裏假設爲始終UTF-8 ...這是不正確的。此外,使用'request.getInputStream()'依賴於文件在請求有效載荷中是獨立的這一事實,這可能並非如此。 – 2012-01-07 22:29:49

+0

1.是的,但是很明顯要改變什麼(而不是依賴於平臺編碼)2.這就是我說的;) – Bozho 2012-01-07 23:02:33

+0

1.沒問題,我確定你知道,這只是因爲這是一個常見的錯誤,不想讓@布蘭克曼幹這件事。我沒有以這種方式得到你的答案。 3.還缺少什麼,而且我的答案中增加了更新文件的多部分方式,這對我來說至少是管理文件的更好方式。 4.謝謝回答 – 2012-01-07 23:07:33

1

你不在這裏將任何東西。只需使用讀取器從原始字符串中讀取數據,然後使用適配器將讀取器視爲InputSource。與IO相比,這些操作完全沒有成本。

+0

+1,但不是它然後在內存中創建2個相同的數據副本?一個100K的xml文件現在在內存中存儲200K的兩種格式no? – Blankman 2012-01-07 22:19:20

+0

否。StringReader對String有一個*引用*,並從中讀取。 InputSource只是向讀者存儲一個* reference *。如果你的意思是你同時擁有XML字符串和分析結果,那麼是的,你是對的。那麼請參閱Bozho的回答。 – 2012-01-07 22:25:27

0

你如何發送你的XML?是否可以將xml作爲HTTP數據發送而不是HTTP參數?然後,您應該能夠將HttpInputStream重定向到InputSource,而無需從String中調用它。

但我認爲從字符串讀取會安靜得很快。只有當你的xmldata非常大時,你可能會遇到性能問題,因爲需要完全讀取數據來構造字符串。

1

實際上,使用HTTP發佈文件的推薦方式是使用multipart/form-data(檢查此RFC-1867)。

使用這個,你甚至可以發佈多個文件,指定他們的MIME類型和他們的編碼 - 大多數答案都使用UTF-8 ...但假設new StringReader(xmlString)幾乎等同,但是有點相當危險更多的錯誤,因爲沒有givin'任何編碼將離開'服務器'默認編碼jvm後備。

對於處理這種文件上傳W/O架構的開銷(如Struts2 ...如果你願意)是使用FileUpload apache lib。

他們建議使用傳統的API(RFC),但他們提供了另一種智能功能使用stream直接...

現在談論的解析,我的POV是一起使用閱讀器的mime -type(由FileUpload給定)用於上傳的文件。因此,與文件上傳,你將有機會獲得FileItem具有item.getContentType()幫助您使用此constructor

編輯

如果你想要去瓦特/框架,甚至更進一步的是Struts 2的創建InputStreamReader。以下是我建議你閱讀這是非常明確的關於如何處理W¯¯教程/文件上傳使用春3updload proglyupload w/ Html