Skip to main content
Table of Contents

Uploading and downloading

Transferring file content is the core of a storage integration. TTMSFNCCloudBox uploads a local file into a Box folder and downloads a Box file to a local path, each reporting completion through an event. Large files use Box's resumable upload sessions automatically. This chapter covers both directions and how to chain them.

Uploading

Upload sends a local file to a Box folder. Use the folder-name overload for a path, or the folder-item overload when you already hold the target folder. OnUploadFile reports the created Box item.

Upload a file to BoxPascalC++
procedure TForm1.UploadReport;
begin
  TMSFNCCloudBox1.OnUploadFile := BoxUploaded;
  // Folder name (or path); pass an empty string for the root.
  TMSFNCCloudBox1.Upload('/Reports', 'C:\local\Q4.pdf');
end;

procedure TForm1.BoxUploaded(Sender: TObject; const AUploadItem: TTMSFNCCloudItem;
  const ARequestResult: TTMSFNCCloudBaseRequestResult);
begin
  if ARequestResult.Success then
    ShowMessage('Uploaded as id ' + AUploadItem.ID)
  else
    ShowMessage('Upload failed: ' + ARequestResult.ResultString);
end;
void __fastcall TForm1::UploadReport()
{
  TMSFNCCloudBox1->OnUploadFile = BoxUploaded;
  // Folder name (or path); pass an empty string for the root.
  TMSFNCCloudBox1->Upload("/Reports", "C:\\local\\Q4.pdf");
}

void __fastcall TForm1::BoxUploaded(TObject *Sender, Fmx::Tmsfnccloudstorage::TTMSFNCCloudItem *AUploadItem,
  TTMSFNCCloudBaseRequestResult *ARequestResult)
{
  if (ARequestResult->Success)
    ShowMessage("Uploaded as id " + AUploadItem->ID);
  else
    ShowMessage("Upload failed: " + ARequestResult->ResultString);
}

Large files are uploaded in chunks via a resumable session; the OnUploadResumableFile, OnUploadResumableFileFinished and OnUploadResumableFileFailed events report chunk progress and outcome.

Downloading

Download saves a Box file to a local path, by item or by name. OnDownloadFile fires when the transfer finishes.

Download a Box filePascalC++
procedure TForm1.DownloadReport;
begin
  TMSFNCCloudBox1.OnDownloadFile := BoxDownloaded;
  TMSFNCCloudBox1.Download('/Reports/Q4.pdf', 'C:\local\Q4.pdf');
end;

procedure TForm1.BoxDownloaded(Sender: TObject;
  const ARequestResult: TTMSFNCCloudBaseRequestResult);
begin
  if ARequestResult.Success then
    ShowMessage('Download complete')
  else
    ShowMessage('Download failed: ' + ARequestResult.ResultString);
end;
void __fastcall TForm1::DownloadReport()
{
  TMSFNCCloudBox1->OnDownloadFile = BoxDownloaded;
  TMSFNCCloudBox1->Download("/Reports/Q4.pdf", "C:\\local\\Q4.pdf");
}

void __fastcall TForm1::BoxDownloaded(TObject *Sender,
  TTMSFNCCloudBaseRequestResult *ARequestResult)
{
  if (ARequestResult->Success)
    ShowMessage("Download complete");
  else
    ShowMessage("Download failed: " + ARequestResult->ResultString);
}

Combining an upload with a download

Chaining the two events lets you act on the uploaded item — here the file is downloaded back under a new local name as soon as the upload completes:

Upload a file, then download it backPascalC++
procedure TForm1.RoundTrip;
begin
  TMSFNCCloudBox1.OnUploadFile := UploadedThenDownload;
  TMSFNCCloudBox1.OnDownloadFile := BoxDownloaded;
  TMSFNCCloudBox1.Upload('/Reports', 'C:\local\Q4.pdf');
end;

procedure TForm1.UploadedThenDownload(Sender: TObject;
  const AUploadItem: TTMSFNCCloudItem;
  const ARequestResult: TTMSFNCCloudBaseRequestResult);
begin
  if not ARequestResult.Success then
    Exit;

  // Download the freshly uploaded item by its returned id/name.
  TMSFNCCloudBox1.Download(AUploadItem, 'C:\local\Q4-copy.pdf');
end;

procedure TForm1.BoxDownloaded(Sender: TObject;
  const ARequestResult: TTMSFNCCloudBaseRequestResult);
begin
  if ARequestResult.Success then
    ShowMessage('Round trip complete');
end;
void __fastcall TForm1::RoundTrip()
{
  TMSFNCCloudBox1->OnUploadFile = UploadedThenDownload;
  TMSFNCCloudBox1->OnDownloadFile = BoxDownloaded;
  TMSFNCCloudBox1->Upload("/Reports", "C:\\local\\Q4.pdf");
}

void __fastcall TForm1::UploadedThenDownload(TObject *Sender,
  Fmx::Tmsfnccloudstorage::TTMSFNCCloudItem *AUploadItem,
  TTMSFNCCloudBaseRequestResult *ARequestResult)
{
  if (!ARequestResult->Success)
    return;

  // Download the freshly uploaded item by its returned id/name.
  TMSFNCCloudBox1->Download(AUploadItem, "C:\\local\\Q4-copy.pdf");
}

void __fastcall TForm1::BoxDownloaded(TObject *Sender,
  TTMSFNCCloudBaseRequestResult *ARequestResult)
{
  if (ARequestResult->Success)
    ShowMessage("Round trip complete");
}

Common mistakes

  • Reusing a folder item across sessions. Folder IDs are stable, but a cached TTMSFNCCloudItem from a previous listing may be stale — re-list or use a folder name/path for long-lived references.
  • Assuming upload is synchronous. Upload returns before the transfer finishes; act on the result in OnUploadFile.

See also