# Send files in chat Users can transfer files in chat during the session. > **Note** > > Zoom deletes files sent via in-session chat when the session ends. ## Prerequisites Enable [send files via in-session chat](/docs/build/account/#in-session-advanced) in your Video SDK account portal settings and configure the following settings. - **Only allow specified file types** - Select to allow only specific file types and enter the file extensions in the text box, separated by commas. - **Maximum file size** - Select to limit the file size to 2048 MB. Check whether the file transfer feature is enabled. ```swift if let isFileTransferEnable = ZoomVideoSDK.shareInstance()?.getSession()?.isFileTransferEnable(), isFileTransferEnable { // File transfer is enabled. } ``` ```objectivec if ([[[ZoomVideoSDK shareInstance] getSession] isFileTransferEnable]) { // File transfer is enabled. } ``` Get the list of allowed file types that you can transfer. ```swift if let fileType = ZoomVideoSDK.shareInstance()?.getSession()?.getTransferFileTypeWhiteList() { // fileType is a string of the allowed file types, multiple values separated by comma. Exe files are forbidden by default. } ``` ```objectivec NSString *fileType = [[[ZoomVideoSDK shareInstance] getSession] getTransferFileTypeWhiteList]; // fileType is a string of the allowed file types, multiple values separated by comma. Exe files are forbidden by default. ``` Get the maximum file size to transfer. ```swift if let maxSize = ZoomVideoSDK.shareInstance()?.getSession()?.getMaxTransferFileSize() { // maxSize is the maximum allowed file size. } ``` ```objectivec NSUInteger maxSize = [[[ZoomVideoSDK shareInstance] getSession] getMaxTransferFileSize]; // maxSize is the maximum allowed file size. ``` ## Send a file to everyone Send a file to all users in the current session. ```swift if let session = ZoomVideoSDK.shareInstance()?.getSession() { let error = session.transferFile("filePath") if error == .Errors_Success { // Transfer started successfully. } else { // Failed to transfer. } } ``` ```objectivec ZoomVideoSDKSession *session = [[ZoomVideoSDK shareInstance] getSession]; ZoomVideoSDKError error = [session transferFile:@"filePath"]; if (error == Errors_Success) { // Transfer started successfully. } else { // Failed to transfer. } ``` ## Send a file to a specific user Send a file to a certain user in the session. ```swift // Get the user you want to send the file to. let userToReceiveFile: ZoomVideoSDKUser let error = userToReceiveFile.transferFile("filePath") if error == .Errors_Success { // Transfer started successfully. } else { // Failed to transfer. } ``` ```objectivec // Get the user you want to send the file to. ZoomVideoSDKUser *userToReceiveFile; ZoomVideoSDKError error = [userToReceiveFile transferFile:@"filePath"]; if (error == Errors_Success) { // Transfer started successfully. } else { // Failed to transfer. } ``` ## Track send progress Implement `onSendFileStatus` on your `ZoomVideoSDKDelegate` to track an outgoing transfer. Read the percentage from the file's `getStatus().transProgress.ratio`, and cancel a transfer that is still in progress by calling `cancelSend` on the `ZoomVideoSDKSendFile`. ```swift func onSendFileStatus(_ file: ZoomVideoSDKSendFile?, status: ZoomVideoSDKFileTransferStatus) { guard let sendingFile = file else { return } switch status { case .FileTransferState_Transfering: // Transfer in progress. ratio is the percentage sent (0–100). let ratio = sendingFile.getStatus()?.transProgress?.ratio ?? 0 // Update your progress UI. To stop while still sending, call cancelSend. // let error = sendingFile.cancelSend() case .FileTransferState_TransferDone: // The file was sent. break case .FileTransferState_TransferFailed: // The transfer failed. Surface an error and let the user retry. break default: break } } ``` ```objectivec - (void)onSendFileStatus:(ZoomVideoSDKSendFile *)file status:(ZoomVideoSDKFileTransferStatus)status { if (!file) { return; } switch (status) { case FileTransferState_Transfering: { // Transfer in progress. ratio is the percentage sent (0–100). NSUInteger ratio = [file getStatus].transProgress.ratio; // Update your progress UI. To stop while still sending, call cancelSend. // [file cancelSend]; break; } case FileTransferState_TransferDone: // The file was sent. break; case FileTransferState_TransferFailed: // The transfer failed. Surface an error and let the user retry. break; default: break; } } ``` ## Receive a file Implement `onReceiveFileStatus` on your `ZoomVideoSDKDelegate`. The first callback arrives with `FileTransferState_ReadyToTransfer` — that is your cue to prompt the user, then call `startReceive` on the `ZoomVideoSDKReceiveFile` to begin downloading the file to a path you choose, or `cancelReceive` to decline it. ```swift func onReceiveFileStatus(_ file: ZoomVideoSDKReceiveFile?, status: ZoomVideoSDKFileTransferStatus) { guard let receiveFile = file else { return } switch status { case .FileTransferState_ReadyToTransfer: // A file is offered. Prompt the user, then accept by downloading to a path you choose... let error = receiveFile.startReceive(filePath) // ...or decline: // let error = receiveFile.cancelReceive() case .FileTransferState_Transfering: // ratio is the percentage downloaded (0–100). let ratio = receiveFile.getStatus()?.transProgress?.ratio ?? 0 // Update your progress UI. case .FileTransferState_TransferDone: // The file finished downloading. break case .FileTransferState_TransferFailed: // The transfer failed. Surface an error and let the user retry. break default: break } } ``` ```objectivec - (void)onReceiveFileStatus:(ZoomVideoSDKReceiveFile *)file status:(ZoomVideoSDKFileTransferStatus)status { if (!file) { return; } switch (status) { case FileTransferState_ReadyToTransfer: { // A file is offered. Prompt the user, then accept by downloading to a path you choose... ZoomVideoSDKError error = [file startReceive:filePath]; // ...or decline: // ZoomVideoSDKError error = [file cancelReceive]; break; } case FileTransferState_Transfering: { // ratio is the percentage downloaded (0–100). NSUInteger ratio = [file getStatus].transProgress.ratio; // Update your progress UI. break; } case FileTransferState_TransferDone: // The file finished downloading. break; case FileTransferState_TransferFailed: // The transfer failed. Surface an error and let the user retry. break; default: break; } } ``` Be sure that you have [set up a delegate for callback events](/docs/video-sdk/ios/integrate/#implement-a-delegate) to receive these callbacks. ## File transfer status values Both `onSendFileStatus` and `onReceiveFileStatus` report where a transfer is in its lifecycle through `ZoomVideoSDKFileTransferStatus`. | Status | Meaning | What to do | | ----------------------------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `FileTransferState_None` | No transfer activity. | Nothing. | | `FileTransferState_ReadyToTransfer` | An incoming file is ready to download. | Prompt the user, then call `startReceive` to accept or `cancelReceive` to decline. | | `FileTransferState_Transfering` | The transfer is in progress. | Read `getStatus().transProgress.ratio` (0–100) to drive a progress UI. Call `cancelSend` or `cancelReceive` to stop. | | `FileTransferState_TransferDone` | The transfer completed. | The file is sent or saved; finalize your UI. | | `FileTransferState_TransferFailed` | The transfer failed. | Surface an error and let the user retry. |