Jaxmpp 文件上傳

在Android中選擇文件上傳至Tigase服務(wù)器

詳見363

申請(qǐng)一個(gè)插槽

<iq from='romeo@montague.tld/garden'
    id='step_03'
    to='upload.montague.tld'
    type='get'>
  <request xmlns='urn:xmpp:http:upload:0'
    filename='test.jpg'
    size='23456'
    content-type='image/jpeg' />
</iq>

to接收者如果沒(méi)有特殊配置則為upload.{你的domain}

必須分別包含文件名(filename)和文件大小(size)屬性,文件類型(content-type)不是必須的

服務(wù)器響應(yīng)

<iq from='upload.montague.tld'
    id='step_03'
    to='romeo@montague.tld/garden'
    type='result'>
  <slot xmlns='urn:xmpp:http:upload:0'>
    <put url='https://upload.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/tr%C3%A8s%20cool.jpg'>
      <header name='Authorization'>Basic Base64String==</header>
      <header name='Cookie'>foo=bar; user=romeo</header>
    </put>
    <get url='https://download.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/tr%C3%A8s%20cool.jpg' />
  </slot>
</iq>

< slot > 元素中會(huì)包含上傳服務(wù)器的依賴信息
文件的上傳是通過(guò) HTTP-PUT 進(jìn)行的竿滨,超出了本文的范圍黍檩。如果 Content-Length 與槽請(qǐng)求的大小不匹配,上載服務(wù)必須拒絕文件上載。如果事先指定的 Content-Type 不匹配,則服務(wù)應(yīng)拒絕該文件。如果客戶端根本沒(méi)有指定 Content-Type,那么服務(wù)可能會(huì)將 application/octet-stream 假定為 Content-Type
<put>中的url為上傳地址
<put>中的header需要跟隨上傳的請(qǐng)求頭同時(shí)上傳
<get>中的url為下載地址

錯(cuò)誤信息

如果請(qǐng)求的文件大小過(guò)大,服務(wù)可能會(huì)響應(yīng)錯(cuò)誤芹缔,而不是向客戶機(jī)提供一個(gè)插槽。此外瓶盛,還會(huì)還會(huì)返回最大的文件大小

<iq from='upload.montague.tld'
    id='step_03'
    to='romeo@montague.tld/garden'
    type='error'>
  <request xmlns='urn:xmpp:http:upload:0'
    filename='très cool.jpg'
    size='23456'
    content-type='image/jpeg' />
  <error type='modify'>
    <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' />
    <text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>File too large. The maximum file size is 20000 bytes</text>
    <file-too-large xmlns='urn:xmpp:http:upload:0'>
      <max-file-size>20000</max-file-size>
    </file-too-large>
  </error>
</iq>

Jaxmpp使用

HttpFileUploadModule 是Jaxmpp對(duì)363的實(shí)現(xiàn)模塊
HttpFileUploadModule.findHttpUploadComponents() 如果不知道接收者最欠,可以調(diào)用該方法獲取

/**
 * 文件上傳
 */
class FileUploadTask(val httpFileUploadModule: HttpFileUploadModule) : ITask {
   
    fun requestUploadPath(contentType: String, path: String) {
       val file= File(path)
        httpFileUploadModule.requestUploadSlot(
            JID.jidInstance(UPLOAD_HOST_NAME),
            file.name,
            file.length(),
            contentType,
            object : HttpFileUploadModule.RequestUploadSlotHandler() {
                override fun onError(
                    responseStanza: Stanza?,
                    error: XMPPException.ErrorCondition?
                ) {
                    //獲取上傳路徑失敗了
                }

                override fun onSuccess(slot: HttpFileUploadModule.Slot?) {
                    //獲取上傳路徑成功
                    slot?.let { upload(slot,contentType,file) }
                }

                override fun onTimeout() {
                    //獲取上傳路徑超時(shí)
                }
            })
    }
    /**
     * jaxmpp沒(méi)有直接支持上傳示罗,執(zhí)行自己的http工具類進(jìn)行上傳
     */
    private fun upload(
        slot: HttpFileUploadModule.Slot,
        contentType: String,
        path: File
    ) {
        HttpUtils.uploadFile(slot, contentType, path)
    }
}

上傳

/**
* 使用OkHttp作為上傳類
*/
fun uploadFile(slot: HttpFileUploadModule.Slot, contentType: String, file: File) {

        val builder = Request.Builder()
        val map = slot.putHeaders
        map.keys.forEach {
            builder.addHeader(it, map[it]!!)
        }
        builder.url(slot.putUri)
        val body = file.asRequestBody(contentType.toMediaType())
        builder.put(body)
        try {
            val response = http.newCall(builder.build()).execute()
            LogUtils.e("上傳結(jié)果 :$response")
        } catch (e: IOException) {
            e.printStackTrace()
        }

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芝硬,隨后出現(xiàn)的幾起案子蚜点,更是在濱河造成了極大的恐慌,老刑警劉巖拌阴,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍绘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡迟赃,警方通過(guò)查閱死者的電腦和手機(jī)陪拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纤壁,“玉大人左刽,你說(shuō)我怎么就攤上這事∽妹剑” “怎么了欠痴?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秒咨。 經(jīng)常有香客問(wèn)我喇辽,道長(zhǎng),這世上最難降的妖魔是什么雨席? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任菩咨,我火速辦了婚禮,結(jié)果婚禮上陡厘,老公的妹妹穿的比我還像新娘旦委。我一直安慰自己,他們只是感情好雏亚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摩钙,像睡著了一般罢低。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖笛,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天网持,我揣著相機(jī)與錄音,去河邊找鬼长踊。 笑死功舀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的身弊。 我是一名探鬼主播辟汰,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼列敲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了帖汞?” 一聲冷哼從身側(cè)響起戴而,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翩蘸,沒(méi)想到半個(gè)月后所意,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扶踊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎任。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秧耗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涝滴,到底是詐尸還是另有隱情绣版,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布歼疮,位于F島的核電站杂抽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏韩脏。R本人自食惡果不足惜缩麸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赡矢。 院中可真熱鬧杭朱,春花似錦、人聲如沸吹散。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)空民。三九已至刃唐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間界轩,已是汗流浹背画饥。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊猾,地道東北人抖甘。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像葫慎,于是被迫代替她去往敵國(guó)和親衔彻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薇宠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 注意事項(xiàng): 1、表單中enctype=”multipart/form-data”是用于設(shè)置表單的MIME編碼米奸。 2...
    IT大表哥閱讀 284評(píng)論 0 2
  • //聯(lián)系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄 一昼接、文件下載 獲取資源文件大小有兩張方式 1、 [...
    石虎132閱讀 656評(píng)論 0 10
  • 文件上傳漏洞: 1.本地驗(yàn)證 本地驗(yàn)證:客戶端本地通過(guò)前臺(tái)JS腳本進(jìn)行檢測(cè)悴晰。 原理: 當(dāng)用戶在客戶端選擇文件點(diǎn)擊上...
    xaviershun閱讀 1,348評(píng)論 0 1
  • 一慢睡、初步認(rèn)識(shí) 1.上傳功能:網(wǎng)站上各種可以上傳文件,圖片的地方可以被用作上傳點(diǎn)進(jìn)行非法上傳 2.上傳原理:在前端代...
    楠昭閱讀 1,633評(píng)論 1 11
  • 0x00 漏洞原理與危害 網(wǎng)站web應(yīng)用程序都有一些文件上傳功能铡溪,比如文檔漂辐、圖片、頭像棕硫、視頻上傳髓涯,當(dāng)上傳功能的實(shí)現(xiàn)...
    Z1ng3r閱讀 1,584評(píng)論 0 1