Support attachments in your app built with XMTP
Use the remote attachment or attachment content type to support attachments in your app.
-
Use the remote attachment content type to send attachments of any size.
-
Use the attachment content type to send attachments smaller than 1MB.
Support remote attachments of any size
Remote attachments of any size can be sent using the RemoteAttachmentCodec and a storage provider.
Install the package
npm i @xmtp/content-type-remote-attachmentIn some SDKs, the
AttachmentCodecis already included in the SDK. If not, you can install the package using the following command:
Configure the content type
After importing the package, you can register the codec.
const client = await Client.create(signer, {
env: "production",
codecs: [new RemoteAttachmentCodec(), new StaticAttachmentCodec()],
});Send a remote attachment
This method takes a DecryptedLocalAttachment object as an argument:
const { encryptedLocalFileUri, metadata } = await alice.encryptAttachment({
fileUri: `file://{file}`,
mimeType: "text/plain",
});Upload an encrypted file to a remote server:
let url = await uploadFile(encryptedLocalFileUri);Send a remote attachment message:
await convo.send({
remoteAttachment: {
...metadata,
scheme: "https://",
url,
},
});Receive, decode, and decrypt a remote attachment
Now that you can receive a remote attachment, you need a way to receive a remote attachment. For example:
On the receiving end, you can use the decryptAttachment method to decrypt the downloaded file. This method takes an EncryptedLocalAttachment object as an argument and returns a DecryptedLocalAttachment object.
if (message.contentTypeId === "xmtp.org/remoteStaticAttachment:1.0") {
// Now we can decrypt the downloaded file using the message metadata.
const attached = await xmtp_client.decryptAttachment({
encryptedLocalFileUri: downloadedFileUri,
metadata: message.content() as RemoteAttachmentContent,
})
//attached.filename
//attached.mimeType
//attached.fileUri
}Display the attachment:
<Image source={{ uri: attached.fileUri }} />To handle unsupported content types, refer to the fallback section.
Support attachments smaller than 1MB
Attachments smaller than 1MB can be sent using the AttachmentCodec. The codec will automatically encrypt the attachment and upload it to the XMTP network.
Install the package
npm i @xmtp/content-type-remote-attachmentIn some SDKs, the
AttachmentCodecis already included in the SDK. If not, you can install the package using the following command:
Import and register
const client = await Client.create(signer, {
env: "production",
codecs: [new StaticAttachmentCodec()],
});Load local file
// Read local file and extract its details
const file = fs.readFileSync("xmtp.png");
const filename = path.basename("xmtp.png");
const extname = path.extname("xmtp.png");
console.log(`Filename: ${filename}`);
console.log(`File Type: ${extname}`);Send encrypted file
// Convert the file to a Uint8Array
const blob = new Blob([file], { type: extname });
let imgArray = new Uint8Array(await blob.arrayBuffer());
const attachment = {
filename: filename,
mimeType: extname, //image, video or audio
data: imgArray,
};
console.log("Attachment created", attachment);
await conversation.send(attachment, { contentType: ContentTypeAttachment });Receive encrypted file
if (message.contentType.sameAs(ContentTypeAttachment)) {
const blobdecoded = new Blob([message.content.data], {
type: message.content.mimeType,
});
const url = URL.createObjectURL(blobdecoded);
}
