【问题标题】:How to uplaod a file in chunks using indy?如何使用 indy 分块上传文件?
【发布时间】:2014-02-17 21:45:55
【问题描述】:

我在使用“OpenDrive API”上传文件时遇到问题。我可以连接并做其他事情。 这里是开发者api:OpenDrive Api

使用 Http Analyzer 我可以看到 Createupload、Openupload 和 Closeupload 之类的操作,但我观察到上传期间没有数据包传输(例如:5mb 的上传传输).. 我不知道如何在 post 时处理 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;

【问题讨论】:

    标签: delphi delphi-xe4 idhttp


    【解决方案1】:

    如果我查看 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
    

    【讨论】:

    • 是的,Create_Upload_File_Chunk_Post 是必需的,但我无法处理这篇文章。需要的参数是“Chunk_Offset”和“Chunk_size”。我如何发布它们?任何代码段或示例将不胜感激。
    • 它们像您的其他字段一样作为 POST 数据发送。您正在创建块,因此您应该知道块有多大,以及每个块的文件偏移量是多少。究竟有什么难理解的?使用TFileStream 打开文件并循环遍历它,直到到达 EOF。对于每个循环迭代,将chunk_offset 设置为当前的TFileStream.Position,然后从文件中读取一个数据块并将chunk_size 设置为读取的字节数,然后发布该块,然后重复。
    猜你喜欢
    • 2011-08-29
    • 2011-09-16
    • 1970-01-01
    • 2014-02-25
    • 2011-12-12
    • 1970-01-01
    • 2021-04-03
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多