模擬multipart form data提交檔案

2021-10-08 03:29:40 字數 2423 閱讀 1637

在上傳附件的場景中,有一種情況比較特殊,伺服器寫的許可權只允許日誌目錄,其他所有目錄禁止寫入,那麼,如果前端以multipart/form-data方式提交檔案的話,因為沒有寫許可權,所以無法把檔案寫入到伺服器的臨時目錄。

一般這種情況下可以採用把檔案轉換成base64格式,以字串形式提交到伺服器,伺服器再還原檔案儲存即可。

post(x-www-form-urlencoded ) ---> 儲存檔案

但是還有一種特殊情況,得到base64還原的檔案後(快取),需要把檔案在request中手動堆砌乙個multipart/form-data的檔案流,然後再調其他微服務提供的介面。

post(x-www-form-urlencoded ) ---> post(multipart/form-data) ----> 儲存檔案

這種情況怎麼辦呢?

通過閱讀原始碼可以得到以下解決方案↓

因為這個案例是需要把客戶端的request完完整整的發給目標伺服器,所以這裡就復用了request(主要是本人能力有限,看原始碼也沒法自己例項化乙個request)

建立乙個request的裝飾類

/**

*/@override

public string getcontenttype()

/*** 頭資訊快取器.

*/private final mapcustomheaders;

/*** 建構函式.

* * @param request

* 請求

*/super(request);

this.customheaders = new hashmap();

} /**

* 設定頭部資訊.

} }

方法解析

getheadernames、putheader、getheader

因為復用request的原因,header已經被固化,禁止操作,所以這裡對header相關方法進行重寫,以達到可以新增自己的header。

getparameter

因為復用request的原因,請求裡面已經包含了乙份base64的檔案資料,而且已經被還原成為檔案了,所以這裡需要清空這個引數,但是筆者沒看到**可以清掉這個資訊。

手工堆砌檔案的請求

// 基於上傳附件原始碼,一切引數(除了檔案型別)都置入url請求內,並手動獲得fileitem加入到attribute中

final diskfileitemfactory factory = new diskfileitemfactory();

final fileitem item = factory.createitem("filename", "text/plain", true,

request.getparameter("filename"));

item.getoutputstream().write(buffer);

final listitems = new arraylist();

items.add(item);

request.setattribute("filelist", items);

這裡需要注意的是

factory.createitem("filename", "text/plain", true, request.getparameter("filename"));

檔名的引數key必須=filename

然後往裡面寫入位元組流即可,,這樣操作的話,,檔案不會被寫到檔案系統中,而是停留在快取中。

也就規避了伺服器沒有寫許可權的情況。

模擬訊號 模擬訊號與模擬電路

訊號 用來攜帶資訊的物理量。電訊號 隨著時間變化的電壓或電流,在數學上,我們可以通過函式來表達這種變化情況,因此我們可以畫出波形。電子電路中的訊號分類 數碼訊號和模擬訊號。模擬訊號的特點 連續性,無論是在時間上還是在數值上。大多數的物理量均為模擬量,如溫度 壓力 流量.非電的物理量可以通過感測器變換...

CG物理模擬 風箏模擬

放風箏是一項起源於中國的傳統娛樂專案,隨後推廣到世界各地。按作用可以分成節日慶典祝福風箏,體育競技類,單純的娛樂向風箏等。要想用計算機較為真實的模擬風箏運動,首先我們先得搞清楚風箏的受力情況。飛行原理 如圖 b 所示,風箏在天空中飛翔時所受的力為 風箏線的張力,尾巴的張力,自身的重力,以及風的作用力...

AcWing 模擬棧 棧 模擬

時 空限制 1s 64mb 實現乙個棧,棧初始為空,支援四種操作 1 push x 向棧頂插入乙個數x 2 pop 從棧頂彈出乙個數 3 empty 判斷棧是否為空 4 query 查詢棧頂元素。現在要對棧進行m個操作,其中的每個操作3和操作4都要輸出相應的結果。第一行包含整數m,表示操作次數。接下...