在開發(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的信息。

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

在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)!