国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OkHttp上傳文件及可能出現(xiàn)的問題

這篇具有很好參考價(jià)值的文章主要介紹了OkHttp上傳文件及可能出現(xiàn)的問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在開發(fā)過程中用的是http請(qǐng)求,但是響應(yīng)流一直為空,獲取到的響應(yīng)流{"n_a_s":1,"atts":[]},最終修改用okhttp方法。http請(qǐng)求方法也放在文章最后,大家如果有類似的問題歡迎一起討論。

? ? /**
     * OA附件生成接口
     * @param urlstr   上傳地址
     * @param filename  路徑
     * @param token
     * @return
     * @throws BusinessException
     * @throws IOException 
     */
    public static String filePost(String urlstr, String filename, String token) throws BusinessException, IOException {

        try {
        OkHttpClient client = new OkHttpClient().newBuilder().build();
                MediaType mediaType = MediaType.parse("text/plain");
                RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
                  .addFormDataPart("file",filename,
                    RequestBody.create(MediaType.parse("application/octet-stream"),
                    new File(filename)))
                  .build();
                Request request = new Request.Builder()
                  .url("http://192.168.1.15:8090/seeyon/rest/attachment?token="+token)
                  .method("POST", body)
                  .addHeader("Cookie", "JSESSIONID=7144DE4003B79E88839BF28F5E89A171")
                  .build();
                Response response = client.newCall(request).execute();
                if (!response.isSuccessful())
                    throw new IOException("Unexpected code " + response);
                return response.body().string();
            } catch (IOException e) {
                throw new BusinessException(e.getMessage(), e);
            }
    }
public static String sendFiles(String urlstr, String filename,String token) throws BusinessException {
        
        DataOutputStream dos = null;
        OutputStream os = null;
        //生成一個(gè)文件,把文件轉(zhuǎn)換成流對(duì)象FileBody
        File file = new File(filename);
        
        JSONObject json = new JSONObject();
        String BOUNDARY = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
        //前綴
        String PREFIX = "--";
        //換行符
        String ROW = "\r\n";
        //產(chǎn)生一個(gè)邊界
//        String BOUNDARY = UUID.randomUUID().toString().replaceAll("-" , "");

        try {
            URL url = new URL(urlstr.toString());
            //打開和url之間的連接
            HttpURLConnection hc = (HttpURLConnection) url.openConnection();
            //請(qǐng)求頭
            //設(shè)置超時(shí)時(shí)間
            hc.setConnectTimeout(10000);
            //允許輸入流
            hc.setDoInput(true);
            //允許輸出流
            hc.setDoOutput(true);
            //不允許使用緩存
            hc.setUseCaches(false);
            //請(qǐng)求方式
            hc.setRequestMethod("POST");
            //設(shè)置通用的請(qǐng)求屬性
            hc.setRequestProperty("accept", "*/*");
            //設(shè)置編碼 utf-8
            hc.setRequestProperty("Charset", "utf-8");
            //設(shè)置為長(zhǎng)連接
            hc.setRequestProperty("Connection", "Keep-Alive");
            //設(shè)置瀏覽器代理
            hc.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36");
            hc.setRequestProperty("token", token);
            //邊界標(biāo)識(shí)
//            String boundary = Long.toHexString(System.currentTimeMillis());
            
            //這里設(shè)置請(qǐng)求方式以及boundary的內(nèi)容,即上面生成的隨機(jī)字符串
//            hc.setRequestProperty("Content-Type", CONTENT_TYPE+"; boundary=----" + boundary);
            hc.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
            hc.connect();
            
            StringBuilder contentBody1 = new StringBuilder();
 
            DataOutputStream out =new DataOutputStream(hc.getOutputStream());
            
            os = hc.getOutputStream();
            dos = new DataOutputStream(os);
            
            String result = "";
            if (file != null) {
            //當(dāng)文件不為空,把文件包裝并且上傳
            //這里定義輸出流,用于之后向服務(wù)器發(fā)起請(qǐng)求
            
                //第一部分參數(shù):excel文件
//                contentBody1.append("Content-Type:").append("multipart/form-data; boundary=" + BOUNDARY).append(ROW);
                contentBody1.append(ROW).append(BOUNDARY).append(ROW);
                //拼接文件名稱
                contentBody1.append("Content-Disposition: form-data; name=\"file\"; filename=\"").append(file.getName())
                .append("\"")
                .append(ROW)
                //設(shè)置內(nèi)容類型為流及編碼為UTF-8
                .append("Content-Type: application/octet-stream; charset=UTF-8");
                //Todo 這兩個(gè)換行很重要 標(biāo)識(shí)文件信息的結(jié)束 后面的信息為文件流
                contentBody1.append(ROW).append(ROW);

                out.write(contentBody1.toString().getBytes(StandardCharsets.UTF_8));
            
              //寫入文件流

                InputStreamReader reader=new InputStreamReader(new FileInputStream(file),"UTF-8");
                //讀入緩沖區(qū)
                char[] buffer = new char[1024];
                //讀入結(jié)果
                StringBuffer sb = new StringBuffer();
                //每次讀入緩沖區(qū)的長(zhǎng)度
                int len;
                //從讀入流中讀取文件內(nèi)容并形成結(jié)果
                while ((len = reader.read(buffer)) != -1) {
                     sb.append(buffer, 0, len);
                }
                byte[] data = sb.toString().getBytes();
                // 向文件寫入內(nèi)容
                out.write(data);

                out.write(ROW.getBytes(StandardCharsets.UTF_8));
                
              //寫入邊界結(jié)束符
                out.write((BOUNDARY+PREFIX).getBytes(StandardCharsets.UTF_8));
                out.close();
                out.flush();//可以理解為發(fā)送請(qǐng)求
                
              //從服務(wù)器獲得回答的內(nèi)容
                /**
                 * 獲取響應(yīng)碼 200=成功
                 * 當(dāng)響應(yīng)成功,獲取響應(yīng)的流
                 */
                int res = hc.getResponseCode();
                //獲取后臺(tái)返回的數(shù)據(jù)
                if (res == 200) {
                    BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(hc.getInputStream()));
                    String line;
                    StringBuffer sb_result = new StringBuffer();
                    while ((line = bufferedReader.readLine()) != null) {
                        sb_result.append(line);
                    }
                    return sb_result.toString();
//                    out.close(); 
         }else {
                BufferedReader bReader = new BufferedReader(new InputStreamReader(hc.getErrorStream(), "UTF-8"));
                int ch;
                while ((ch = bReader.read()) != -1) {
                    result += String.valueOf((char) ch);
                }
                throw new BusinessException(result, res + "");
            }    }    
        } catch (Exception e) {
            Logger.error("發(fā)送 POST 請(qǐng)求出現(xiàn)異常!" + e);
            throw new BusinessException("發(fā)送 POST 請(qǐng)求出現(xiàn)異常:" + e.getMessage(), e);
        } finally {
            if (dos != null) {
                try {
                    dos.close();
                } catch (Exception e2) {
                    Logger.error(e2.getMessage(), e2);
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (Exception e2) {
                    Logger.error(e2.getMessage(), e2);
                }
            }
            if(!"".equals(json)&&json!=null) {
                JSONObject parseObject = JSONObject.parseObject(json.toString());
                Object object = parseObject.get("fileUrl");
                if(!"".equals(object)&&object!=null) {
                    return object.toString();
                }
//                log.writesendlog(url1+";;type:"+type+";;;數(shù)據(jù):"+param, entityName+"error","");
            }
        }
        return FAILURE;
    }

PS:okhttp方法需要okhttp3和okio兩個(gè)jar包,需要可以私信。


今天代碼打到測(cè)試環(huán)境發(fā)現(xiàn)上傳附件還是獲取不到fileurl這個(gè)值,在postman測(cè)試時(shí)發(fā)送正常,我將postman中的代碼取出(如下),懷疑是Cookie引發(fā)的問題,仔細(xì)查看Cookie獲取的是JSESSIONID,這個(gè)id是從哪里獲取到的呢?

OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
                  .addFormDataPart("file","/C:/Users/86177/Desktop/發(fā)起OA流程表單接口.doc",
                  RequestBody.create(MediaType.parse("application/octet-stream"),
                  new File("/C:/Users/86177/Desktop/發(fā)起OA流程表單接口.doc")))
                  .build();
Request request = new Request.Builder()
                  .url("https://127.0.0.1:80/seeyon/rest/attachment?token=391ed45d-798a-4a08-b0cd-6631ac2173b6")
                  .method("POST", body)
                  .addHeader("Cookie", "JSESSIONID=FC05529B631B89C2F1B9F21DDC845A50; route=d9b669d27408c3f4e55a50b632da8fb2")
                  .build();
Response response = client.newCall(request).execute();

讓我們先看一下用postman獲取到的附件上傳的截圖,圖中可以看出此時(shí)可以附件已經(jīng)發(fā)送成功,Cookie的值是187EC412AF0F028ACFA24BDB59FEF602,我詢問了OA的老師,老師說token要獲取登錄名,建議我看看有沒有獲取到,我才想起來(lái)之前發(fā)送HTTP請(qǐng)求是我并沒有綁定登錄名,我用postman再次查看之前獲取token的信息。

okhttp3 上傳文件,用友,http,開發(fā)語(yǔ)言,后端,Powered by 金山文檔

此時(shí)可以看到綁定登錄者的token返回時(shí)會(huì)帶回sessionid,這個(gè)值就是我們想要的,請(qǐng)求的url地址應(yīng)該是http://IP:端口/seeyon/rest/token/用戶名/密碼?loginName=登錄名

okhttp3 上傳文件,用友,http,開發(fā)語(yǔ)言,后端,Powered by 金山文檔

在HTTP請(qǐng)求獲取token返回時(shí)還遇到了中文亂碼問題,一并指出,在下文得到輸入流時(shí)進(jìn)行utf-8轉(zhuǎn)碼,最后從result結(jié)果中獲取到發(fā)送成功的id,不需要sessionid,因?yàn)榻壎擞脩裘膇d可以在發(fā)送附件時(shí)自動(dòng)存儲(chǔ)在cookie。以上就是我在開發(fā)中遇到的問題,希望對(duì)你有所幫助。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-693861.html

? ? /**
     * 獲取token
     * @return
     */
    public static String getToken2() {
        String result = "";
        String id = "";
        
        try{
            String oAURL = SysInitQuery.getParaString("GLOBLE00000000000000", "OAURL");
            String oAusername = SysInitQuery.getParaString("GLOBLE00000000000000", "OAuser");
            String oAPassword = SysInitQuery.getParaString("GLOBLE00000000000000", "OApassword");
            StringBuilder lasturl = new StringBuilder(oAURL+"/seeyon/rest/token/"+oAusername+"/"+oAPassword+"?loginName=tianxiang");
            URL url = new URL(lasturl.toString());
            //打開和url之間的連接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            //請(qǐng)求頭
            urlConn.setRequestProperty("Content-Type", "application/json");
            urlConn.setRequestProperty("Accept", "application/json;charset=UTF-8");
            
            urlConn.setDoOutput(true);
            urlConn.setDoInput(true);
            urlConn.setRequestMethod("GET");//GET和POST必須全大寫
            urlConn.connect();

            int code = urlConn.getResponseCode();//獲得響應(yīng)碼
            if(code == 200) {//響應(yīng)成功,獲得響應(yīng)的數(shù)據(jù)
//                InputStream is = urlConn.getInputStream();//得到數(shù)據(jù)流(輸入流)
                InputStreamReader is = new InputStreamReader(urlConn.getInputStream(),"UTF-8");
                BufferedReader bufferedReader = new BufferedReader(is);
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                result = stringBuffer.toString();

                if(!"".equals(result)&&result!=null){
                    JSONObject parseObject = JSONObject.parseObject(result);
                    Object object = parseObject.get("id");
                    if(object != null && !"".equals(object)) {
                         urlConn.disconnect();   //斷開連接
                        return object.toString();
                    }
                }
            }
            urlConn.disconnect();   //斷開連接

        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

到了這里,關(guān)于OkHttp上傳文件及可能出現(xiàn)的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring boot 使用 Okhttp3

    Spring boot 集成 okhttp3, 使用 http,https 在項(xiàng)目調(diào)用第三方服務(wù)是在所難免的,運(yùn)用傳統(tǒng)類型的Http調(diào)用,封裝繁瑣,代碼量多還不簡(jiǎn)潔,避免一次一次的 找 度娘, 小記一下。 引入jar OkRestClient 工具類 OkHttp動(dòng)態(tài)配置 使用 OkHttp 使用OkHttp 時(shí) 只需要注入?@AutoWired OkRestClient okRestC

    2024年02月11日
    瀏覽(22)
  • Java之okhttp3請(qǐng)求方式

    Java之okhttp3請(qǐng)求方式

    在java開發(fā)中,發(fā)起http請(qǐng)求是非常常見的需求,常用的有HttpClient,下面聊一下okhttp3的請(qǐng)求方式。 1、引入okhttp3依賴 2、提供springboot工程及http接口 3、http請(qǐng)求 4、請(qǐng)求結(jié)果 get請(qǐng)求 post請(qǐng)求 form表單請(qǐng)求 可見發(fā)起http請(qǐng)求還是挺方便的,感興趣的小伙伴可以試試~~~///( v )~~~

    2024年02月13日
    瀏覽(14)
  • Android Okhttp3 分發(fā)器源碼解析

    在 OkHttp 中,分發(fā)器(Dispatcher)是負(fù)責(zé)調(diào)度和執(zhí)行網(wǎng)絡(luò)請(qǐng)求的組件。它 管理 著 并發(fā) 的 請(qǐng)求數(shù)量 以及請(qǐng)求的 優(yōu)先級(jí) ,確保合理地使用底層的連接池和線程池,從而 提高 網(wǎng)絡(luò)請(qǐng)求的 效率 和 性能 。 默認(rèn)情況下,OkHttp 使用一個(gè)單例的分發(fā)器,它可以處理同時(shí)進(jìn)行的最大請(qǐng)求

    2024年02月12日
    瀏覽(21)
  • Android okhttp3.0配置https信任所有證書

    參考: Android okhttp3.0配置https的自簽證書和信任所有證書

    2024年02月19日
    瀏覽(20)
  • SpringBoot集成websocket(4)|(使用okhttp3實(shí)現(xiàn)websocket)

    章節(jié) 第一章鏈接: SpringBoot集成websocket(1)|(websocket客戶端實(shí)現(xiàn)) 第二章鏈接: SpringBoot集成websocket(2)|(websocket服務(wù)端實(shí)現(xiàn)以及websocket中轉(zhuǎn)實(shí)現(xiàn)) HTTP是現(xiàn)代應(yīng)用常用的一種交換數(shù)據(jù)和媒體的網(wǎng)絡(luò)方式,高效地使用HTTP能讓資源加載更快,節(jié)省帶寬。OkHttp是一個(gè)高效的HTTP客戶

    2024年02月10日
    瀏覽(19)
  • Android Okhttp3添加https自簽名證書以及Glide4

    Android Okhttp3添加https自簽名證書以及Glide4

    沒有得到安卓認(rèn)可的證書頒發(fā)機(jī)構(gòu)頒發(fā)的證書. 自己頒發(fā)的證書, 分臨時(shí)性的(在開發(fā)階段使用)或在發(fā)布的產(chǎn)品中永久性使用的兩種. 而只有Android系統(tǒng)認(rèn)可的機(jī)構(gòu)辦法的證書,在使用過程中才不會(huì)出現(xiàn)安全提示。 為什么會(huì)有人使用自簽名的證書呢? (重要的事重復(fù)三遍)免費(fèi)

    2024年04月16日
    瀏覽(26)
  • 在Java版的OkHttp3 中 RequestBody.create() 過時(shí)解決方案

    在Java版的OkHttp3 中 RequestBody.create() 過時(shí)解決方案

    當(dāng)使用下面的代碼時(shí)會(huì)提示 RequestBody.create() 已過時(shí)。 如下圖: 解決辦法: 如下圖:

    2024年02月16日
    瀏覽(15)
  • Android OKhttp使用(下載和上傳文件)

    首先在build.gradle中引入okhttp 下面是demo(用okthttp下載網(wǎng)絡(luò)上的資源) 用okthttp將資源上傳至網(wǎng)絡(luò)

    2024年02月11日
    瀏覽(36)
  • Android Okhttp3添加https自簽名證書以及Glide4,Android高級(jí)工程師進(jìn)階學(xué)習(xí)—Android熱修復(fù)原理

    Android Okhttp3添加https自簽名證書以及Glide4,Android高級(jí)工程師進(jìn)階學(xué)習(xí)—Android熱修復(fù)原理

    二、自簽名證書 什么是自簽名證書(self-signed certicates)? 自簽名證書就是沒有通過受信任的證書頒發(fā)機(jī)構(gòu), 自己給自己頒發(fā)的證書. SSL 證書大致分三類: 由安卓認(rèn)可的證書頒發(fā)機(jī)構(gòu)CA(Certificate Authority)(如: VeriSign、DigiCert), 或這些機(jī)構(gòu)的下屬機(jī)構(gòu)頒發(fā)的證書. 沒有得到安卓認(rèn)可的

    2024年04月17日
    瀏覽(27)
  • okhttp下載文件 Java下載文件 javaokhttp下載文件 下載文件 java下載 okhttp下載 okhttp

    示例 http客戶端 用的是 okhttp,也可以用 UrlConnetcion或者apache okhttp官網(wǎng) 也可以下載 okhttp jar方式引入 1.1、okhttp發(fā)起請(qǐng)求官網(wǎng)Demo 3.1讀寫內(nèi)容

    2024年02月12日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包