最近要求軟體可以直接保存檔案到用戶的網盤中,找了百度網盤API先進行測驗,因為百度網盤API沒有delphi的sdk包,只能自己按照API格式,get或者host資料,現在可以實作授權、查詢配額、讀取串列等,但是上傳檔案始終不行,我使用indy10的idhttp控制元件,post資料時一直出錯,API說明如下:
百度網盤上傳單個檔案API:
上傳單個檔案
API演示
功能
上傳單個檔案。
百度PCS服務目前支持最大2G的單個檔案上傳。
如需支持超大檔案(>2G)的斷點續傳,請參考下面的“分片檔案上傳”方法。
HTTP請求方式
POST
URL
https://c.pcs.baidu.com/rest/2.0/pcs/file
注意:
兼容原有域名pcs.baidu.com;使用新域名c.pcs.baidu.com,則提供更快、更穩定的上傳服務。
請求引數
引數名稱 型別 是否必需 描述
method string 是 固定值,upload。
access_token string 是 開發者準入標識,HTTPS呼叫時必須使用。
path string 是 上傳檔案路徑(含上傳的檔案名稱)。
注意:
路徑長度限制為1000
路徑中不能包含以下字符:\\ ? | " > < : *
檔案名或路徑名開頭結尾不能是“.”或空白字符,空白字符包括: \r, \n, \t, 空格, \0, \x0B
file char[] 是 上傳檔案的內容。
ondup string 否
overwrite:表示覆寫同名檔案;
newcopy:表示生成檔案副本并進行重命名,命名規則為“檔案名_日期.后綴”。
注意:
上述四個引數中file需通過POST表單進行傳遞,其他引數則需通過query_string進行傳遞。
回傳引數
引數名稱 型別 UrlEncode 描述
path string 是 該檔案的絕對路徑。
size uint64 否 檔案位元組大小。
ctime uint64 否 檔案創建時間。
mtime uint64 否 檔案修改時間。
md5 string 否 檔案的md5簽名。
fs_id uint64 否 檔案在PCS的臨時唯一標識ID。
示例
請求示例:
POST https://pcs.baidu.com/rest/2.0/pcs/file?method=upload&path=%2fapps%2falbum%2f1.JPG&access_token=b778fb598c717c0ad7ea8c97c8f3a46f
回應示例:
{
"path" : "/apps/album/1.jpg",
"size" : 372121,
"ctime" : 1234567890,
"mtime" : 1234567890,
"md5" : "cb123afcc12453543ef",
"fs_id" : 12345,
"request_id":4043312669
}
使用idhttp 代碼如下:
IdHTTP1.ProtocolVersion:=pv1_1;
IdHTTP1.HandleRedirects := True;
Idhttp1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)';
IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions+[hoKeepOrigProtocol];
idStream := TIdMultiPartFormDataStream.Create;
response := TStringStream.Create('');
sURL :='https://pcs.baidu.com/rest/2.0/pcs/file?method=upload&path=%2Fapps%2Fswrtest'
+'%2F1053.txt&access_token=3.897697a4f3562f2c1be2744a5847cbf9.2592000.'
+'1380763835.1093865639-1269890';
idStream.AddFile('file1', 'c:\1213.txt', 'multipart/form-data');
idhttp1.Request.ContentType := idStream.RequestContentType;
idStream.Position := 0;
idhttp1.Post(sURL, idStream, response);
發送了以后一直報錯'HTTP1.1/ 403 Forbidden',需要上傳檔案,希望有這方面經驗的老大指點一下!!
uj5u.com熱心網友回復:
沒人來回答下嗎,應該就是post檔案到這個網址的時候有問題,不知道怎么解決呢uj5u.com熱心網友回復:
會不會是編碼的問題(如utf)?uj5u.com熱心網友回復:
編碼應該怎么測驗呢,現在就是要上傳檔案,API說明中就是說的檔案轉成位元組流上傳,沒有說什么編碼啊uj5u.com熱心網友回復:
求高手啊,在線等呢uj5u.com熱心網友回復:
找到一段Java寫的代碼,有沒有人能幫忙翻譯成delphi的[java] view plaincopyprint?/**
* @param path 云盤存放路徑
* @param name 要上傳的檔案
* @return
* @throws Exception
*/
public FileBase uploadFile(String path,File file) throws Exception{
//模擬檔案
String fileName="README.md";
file = new File(fileName);
path="%2fapps%2fmybaidu%2f"; // 我用的是url編碼過原始碼為:-> "/apps/mybaidu/
/"
//將需要url傳值的引數和url組裝起來
String u ="https://pcs.baidu.com/rest/2.0/pcs/file?path="+path+file.getName()+"&method=upload&access_token=你自己申請的token值";
PostMethod filePost = new PostMethod(u);
//post提交的引數
Part[] parts = {new FilePart(fileName,file)};
//設定多媒體引數,作用類似form表單中的enctype="multipart/form-data"
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
HttpClient clients = new HttpClient();
//回應代碼
int status = clients.executeMethod(filePost);
System.out.println("成功上傳"+path+fileName);
BufferedReader buReader = new BufferedReader(new InputStreamReader(filePost.getResponseBodyAsStream(),"utf-8"));
StringBuffer sb = new StringBuffer();
String line;
while((line=buReader.readLine())!=null){
sb.append(line);
}
buReader.close();
// 決議成物件
Gson gson = new Gson();
FileBase cloudInfo = gson.fromJson(sb.toString(), FileBase.class);
return cloudInfo;
}
uj5u.com熱心網友回復:
同求啊!
uj5u.com熱心網友回復:
再頂下,這幾天沒空搞這個,也沒人回啊uj5u.com熱心網友回復:
哎,沒人回啊uj5u.com熱心網友回復:
哎,沒人回怎么結貼呢uj5u.com熱心網友回復:
403應該是URL路徑的問題,但按理說應該沒有問題。。uj5u.com熱心網友回復:
TIdMultiPartFormDataStream不算是位元組流吧,算是上傳檔案的方式.用filestream試一下看行不行
uj5u.com熱心網友回復:
暫時沒搞了,不過還是沒實作,哎uj5u.com熱心網友回復:
我也在搞這個,是C#+winform的,一樣上傳不上去,這個得申請PCS API還有Access_Token這兩個都搞不定。你那邊搞定了嗎?
uj5u.com熱心網友回復:
用put 方法試試吧。uj5u.com熱心網友回復:
輕輕頂一下 同求uj5u.com熱心網友回復:
頂一下繼續。。。uj5u.com熱心網友回復:
我也正在搞這個上傳百度的功能,我也來幫忙頂一下。uj5u.com熱心網友回復:
樓主你好,不知道大家能不能看到這則留言,其實樓主的程式沒有問題,關鍵在這一句:IdHTTP1.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)';
IdHTTP1.HTTPOptions:=IdHTTP1.HTTPOptions+[hoKeepOrigProtocol];
只需要把這一句改為:
IdHTTP1.Request.UserAgent:=‘abc’;
就可以了,沒想到吧,就是這么簡單,不知道為什么只有幾個字母或者數字的UA才可以。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76086.html
標籤:網絡通信/分布式開發
下一篇:delphi匯入halcon庫
