Smack/documentation/extensions/filetransfer.md

156 lines
6.3 KiB
Markdown
Raw Normal View History

2014-08-16 00:09:55 +02:00
File Transfer
=============
[Back](index.md)
2014-08-16 00:09:55 +02:00
The file transfer extension allows the user to transmit and receive files.
* Send a file to another user
2018-04-03 14:30:09 +02:00
* Receiving a file from another user
2014-08-16 00:09:55 +02:00
* Monitoring the progress of a file transfer
**XEP related:** [XEP-95](http://www.xmpp.org/extensions/xep-0095.html) [XEP-96](http://www.xmpp.org/extensions/xep-0096.html) [XEP-65](http://www.xmpp.org/extensions/xep-0065.html) [XEP-47](http://www.xmpp.org/extensions/xep-0047.html)
Send a file to another user
---------------------------
**Description**
A user may wish to send a file to another user. The other user has the option
2018-04-03 14:30:09 +02:00
of accepting, rejecting, or ignoring the users request. Smack provides a
simple interface in order to enable the user to easily send a file.
**Usage**
2014-08-16 00:09:55 +02:00
In order to send a file you must first construct an instance of the
**_FileTransferManager_** class. In order to instantiate the manager
2018-04-03 14:30:09 +02:00
you should call _FileTransferManager.getInstanceFor(connection)_, where connection is an XMPPConnection instance.
2014-08-16 00:09:55 +02:00
Once you have your **_FileTransferManager_** you will need to create an
outgoing file transfer to send a file. The method to use on the
**_FileTransferManager_** is the **createOutgoingFileTransfer(userID)**
method. The userID you provide to this method is the fully-qualified jabber ID
of the user you wish to send the file to. A fully-qualified jabber ID consists
2018-04-03 14:30:09 +02:00
of a node, a domain, and a resource. The user must be connected to the
resource in order to be able to receive the file transfer.
2014-08-16 00:09:55 +02:00
Now that you have your **_OutgoingFileTransfer_** instance you will want to
send the file. The method to send a file is **sendFile(file, description)**.
The file you provide to this method should be a readable file on the local
file system, and the description is a short description of the file to help
the user decide whether or not they would like to recieve the file.
For information on monitoring the progress of a file transfer see the
monitoring progress section of this document.
Other means to send a file are also provided as part of the
**_OutgoingFileTransfer_**. Please consult the Javadoc for more information.
2018-04-03 14:30:09 +02:00
2014-08-16 00:09:55 +02:00
**Examples**
In this example we can see how to send a file:
```
// Create the file transfer manager
FileTransferManager manager = FileTransferManager.getInstanceFor(connection);
2014-08-16 00:09:55 +02:00
// Create the outgoing file transfer
2018-04-03 14:30:09 +02:00
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(entityFullJid);
2014-08-16 00:09:55 +02:00
// Send the file
transfer.sendFile(new File("shakespeare_complete_works.txt"), "You won't believe this!");
```
2018-04-03 14:30:09 +02:00
Receiving a file from another user
2014-08-16 00:09:55 +02:00
----------------------------------
**Description**
2018-04-03 14:30:09 +02:00
The user may wish to receive files from another user. The process of receiving
a file is event driven, new file transfer requests are received from other
2014-08-16 00:09:55 +02:00
users via a listener registered with the file transfer manager.
**Usage**
2018-04-03 14:30:09 +02:00
In order to receive a file you must first construct an instance of the
**_FileTransferManager_** class. This class has one static factory method with one
2014-08-16 00:09:55 +02:00
parameter which is your XMPPConnection. In order to instantiate the manager
2018-04-03 14:30:09 +02:00
you should call _FileTransferManager.getInstanceFor(connection)_.
2014-08-16 00:09:55 +02:00
Once you have your **_FileTransferManager_** you will need to register a
2018-04-03 14:30:09 +02:00
listener with it. The FileTransferListener interface has one method,
**fileTransferRequest(request)**. When a request is received through this
2014-08-16 00:09:55 +02:00
method, you can either accept or reject the request. To help you make your
decision there are several methods in the **_FileTransferRequest_** class that
return information about the transfer request.
2018-04-03 14:30:09 +02:00
To accept the file transfer, call the **accept()** method. This method will create an
2014-08-16 00:09:55 +02:00
**_IncomingFileTransfer_**. After you have the file transfer you may start to
transfer the file by calling the **recieveFile(file)** method. The file
2018-04-03 14:30:09 +02:00
provided to this method will be where the data from the file transfer is saved.
2014-08-16 00:09:55 +02:00
Finally, to reject the file transfer the only method you need to call is
2018-04-03 14:30:09 +02:00
**reject()** on the **_FileTransferRequest_**.
2014-08-16 00:09:55 +02:00
For information on monitoring the progress of a file transfer see the
monitoring progress section of this document.
2018-04-03 14:30:09 +02:00
Other means to receive a file are also provided as part of the
2014-08-16 00:09:55 +02:00
**_IncomingFileTransfer_**. Please consult the Javadoc for more information.
2018-04-03 14:30:09 +02:00
2014-08-16 00:09:55 +02:00
**Examples**
In this example we can see how to approve or reject a file transfer request:
```
// Create the file transfer manager
final FileTransferManager manager = FileTransferManager.getInstanceFor(connection);
2014-08-16 00:09:55 +02:00
// Create the listener
manager.addFileTransferListener(new FileTransferListener() {
public void fileTransferRequest(FileTransferRequest request) {
// Check to see if the request should be accepted
2018-04-03 14:30:09 +02:00
if (shouldAccept(request)) {
2014-08-16 00:09:55 +02:00
// Accept it
IncomingFileTransfer transfer = request.accept();
transfer.recieveFile(new File("shakespeare_complete_works.txt"));
} else {
// Reject it
request.reject();
}
}
});
```
Monitoring the progress of a file transfer
------------------------------------------
**Description**
While a file transfer is in progress you may wish to monitor the progress of a
file transfer.
**Usage**
Both the **_IncomingFileTransfer_** and the **_OutgoingFileTransfer_** extend
the **_FileTransfer_** class which provides several methods to monitor how a
file transfer is progressing:
2018-04-03 14:30:09 +02:00
* **getStatus()** - The file transfer can be in several states, negotiating, rejected, cancelled, in progress, error, and complete. This method will return which state the file transfer is currently in.
* **getProgress()** - If the status of the file transfer is in progress this method will return a number between 0 and 1, 0 being the transfer has not yet started and 1 being the transfer is complete. It may also return a -1 if the transfer is not in progress.
2014-08-16 00:09:55 +02:00
* **isDone()** - Similar to getProgress() except it returns a _boolean_. If the state is rejected, canceled, error, or complete then true will be returned and false otherwise.
2018-04-03 14:30:09 +02:00
* **getError()** - If there is an error during the file transfer this method will return the type of error that occured.
**Examples**
2014-08-16 00:09:55 +02:00
In this example we can see how to monitor a file transfer:
```
while(!transfer.isDone()) {
2018-04-03 14:30:09 +02:00
if (transfer.getStatus().equals(Status.error)) {
2014-08-16 00:09:55 +02:00
System.out.println("ERROR!!! " + transfer.getError());
} else {
System.out.println(transfer.getStatus());
System.out.println(transfer.getProgress());
}
sleep(1000);
}
```