2014-02-17 2 views
0

У меня проблема с загрузкой файлов с помощью «OpenDrive API». Я могу подключаться и делать другие вещи. Вот разработчик апи: OpenDrive ApiКак переместить файл в куски, используя indy?

Использование Http Analyzer можно увидеть работы как Createupload, Openupload и Closeupload, но я замечаю, что нет пакета передачи во время загрузки (например: 5МБ передачи загрузки) .. Я не могу понять out Как обрабатывать chunksize, chunk_offset во время публикации.

Вот мои коды: -

procedure TUploadThread.Execute; 
var 
Filename : string; 
CreateFileParams : TStrings; 
OpenFileParams :TStrings; 
CloseFileParams : TStrings; 
JResponse : string; 
FileID : string; 
TempLocation : string; 
JFileCreateObject :ISuperObject; 
JFileOpenObject : ISuperObject; 

begin 
    filename := ExtractFileName(frmMain.OpenDialog.FileName); 

    try 
    CreateFileParams := TStringList.Create; 

    CreateFileParams.Add('session_id=' + frmMain.SessionKey); 
    CreateFileParams.Add('folder_id=' + frmMain.CurrentFolderID); 
    CreateFileParams.Add('file_name=' + FileName); 
    CreateFileParams.Add('file_size=' + frmMain.UploadFileSize); 
    CreateFileParams.Add('access_folder_id=Public'); 

    try 
     { Try To Create An Instance Of File In The Server } 
     JResponse := frmMain.HttpClient.Post('https://dev.opendrive.com/api/v1/upload/create_file.json',CreateFileParams); 

     { Now We Have Got FileID & DIR_Update Time from ResponseFileCreate in JSON Format. Lets Parse FileID For later use } 
     JFileCreateObject := SO(JResponse); 
     FileID := JFileCreateObject['FileId'].AsString; { Here we got FileID} 

     OpenFileParams := TStringList.Create; 
     OpenFileParams.Add('session_id=' + frmMain.SessionKey); 
     OpenFileParams.Add('file_id=' + FileID); 
     OpenFileParams.Add('file_size=' + frmMain.UploadFileSize); 
     OpenFileParams.Add('access_folder_id=Public'); 

     try 
     Sleep(1000); { Wait For 1 sec Then Perform Another Request } 
     JResponse := frmMain.HttpClient.Post('https://dev.opendrive.com/api/v1/upload/open_file_upload.json', OpenFileParams); 
     { Now Parse TempLocation From The Json Response In Jresponse } 
     JFileOpenObject := SO(JResponse); 
     TempLocation := JFileOpenObject['TempLocation'].AsString; 

     { Finally, Lets pass the parameters to the close Upload session } 
     CloseFileParams := TStringList.Create; 
     CloseFileParams.Add('session_id=' + frmMain.SessionKey); 
     CloseFileParams.Add('file_id=' + FileID); 
     CloseFileParams.Add('temp_location=' + TempLocation); 
     CloseFileParams.Add('file_size=' + frmMain.UploadFileSize); 
     CloseFileParams.Add('access_folder_id=Public'); 

     Sleep(1000); { Wait for 1 sec Then Perform Another Request } 
     JResponse := frmMain.HttpClient.Post('https://dev.opendrive.com/api/v1/upload/close_file_upload.json', CloseFileParams); 

     { If Nothing Exception raises, File Is Uploaded..Wait 1 Sec and Reload The Folder } 
     frmMain.btnRefresh.Click; 

     finally 
     end; 

    except 
     ShowMessage('An Error Occured While Uplaoding File(s).Please Try Aagin'); 
    end; 
    finally 
    CreateFileParams.Free; 
    OpenFileParams.Free; 
    CloseFileParams.Free; 
    end; 
end; 

ответ

2

Если я смотрю на API, то вы должны использовать следующие два API, а также.

https://dev.opendrive.com/api/explorer/#!/upload/createResumable_post

и

https://dev.opendrive.com/api/explorer/#!/upload/createUpload_file_chunk_post

вы могли бы быть в состоянии уйти без createResumable вызова, но не загрузить файл куска один.

Ваш процесс должен, вероятно, будет что-то вроде этого:

CreateFile 
Open File Upload 
Loop 
    Upload File Chunk 
End Loop 
Close File Upload 
+0

Да, Create_Upload_File_Chunk_Post требуется, но я не в состоянии справиться с этой должности. Необходимыми параметрами являются «Chunk_Offset» и «Chunk_size». Как я могу опубликовать их? Любой сегмент кода или пример будут оценены. –

+0

Они отправляются как данные POST так же, как и ваши другие поля. Вы создаете куски, так что вы должны знать, насколько велики ваши куски, и каков размер файла для каждого куска. Чего это трудно понять? Откройте файл с помощью 'TFileStream' и пропустите его, пока не достигнете EOF. Для каждой итерации цикла установите 'chunk_offset' в текущее' TFileStream.Position', затем прочитайте блок данных из файла и установите 'chunk_size' в число прочитанных байтов, затем POST, который будет блокироваться, а затем повторите. –

Смежные вопросы