Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
SDK Obrolan bekerja dengan mulus dengan Microsoft Teams dalam konteks rapat. Hanya pengguna Teams yang dapat mengirim lampiran file ke pengguna Azure Communication Services. Pengguna Azure Communication Services tidak dapat mengirim lampiran file ke pengguna Teams. Untuk kemampuan saat ini, lihat Obrolan interop Teams.
Menambahkan dukungan lampiran file
SDK Obrolan menyediakan previewUrl
properti untuk setiap lampiran file. Secara khusus, previewUrl
tautan ke halaman web di SharePoint tempat pengguna dapat melihat konten file, mengedit file, dan mengunduh file jika izin memungkinkan.
Beberapa batasan dikaitkan dengan fitur ini:
Admin Teams dari penyewa pengirim dapat memberlakukan kebijakan yang membatasi atau menonaktifkan fitur ini sepenuhnya. Misalnya, admin Teams dapat menonaktifkan izin tertentu (seperti
Anyone
) yang dapat menyebabkan URL lampiran file (previewUrl
) tidak dapat diakses.Saat ini kami hanya mendukung dua izin file:
Anyone
-
People you choose
(dengan alamat email)
Beri tahu pengguna Teams Anda bahwa semua izin lain (seperti
People in your organization
) tidak didukung. Pengguna Teams Anda harus memeriksa kembali untuk memastikan izin default didukung setelah mereka mengunggah file di klien Teams mereka.URL unduhan langsung (
url
) tidak didukung.
Selain file reguler (dengan AttachmentType
), file
Chat SDK juga menyediakan AttachmentType
properti .image
Pengguna Azure Communication Services dapat melampirkan gambar dengan cara yang mencerminkan perilaku bagaimana klien Microsoft Teams mengonversi lampiran gambar menjadi gambar sebaris di lapisan UI. Untuk informasi selengkapnya, lihat Menangani lampiran gambar.
Pengguna Azure Communication Services dapat menambahkan gambar melalui Unggah dari perangkat ini, yang dirender di sisi Teams dan SDK Obrolan mengembalikan lampiran seperti image
. Untuk gambar yang diunggah melalui Lampirkan file cloud, gambar diperlakukan sebagai file reguler di sisi Teams sehingga SDK Obrolan mengembalikan lampiran seperti file
.
Perhatikan juga bahwa pengguna Azure Communication Services hanya dapat mengunggah file dengan menggunakan seret dan letakkan atau melalui perintah menu lampiran Unggah dari perangkat ini dan Lampirkan file cloud. Jenis pesan tertentu dengan media yang disematkan (seperti klip video, pesan audio, dan kartu cuaca) saat ini tidak didukung.
Tutorial ini menjelaskan cara mengaktifkan dukungan lampiran file dengan menggunakan SDK Obrolan Azure Communication Services untuk JavaScript.
Kode Sampel
Temukan kode akhir tutorial ini di GitHub.
Prasyarat
- Tinjau mulai cepat Bergabung dengan aplikasi Obrolan Anda ke rapat Teams.
- Membuat sumber daya Azure Communication Services. Untuk detailnya selengkapnya, lihat Membuat sumber daya Azure Communication Services. Anda perlu merekam string koneksi Anda untuk tutorial ini.
- Siapkan rapat Teams dengan menggunakan akun bisnis Anda dan siapkan URL rapat.
- Gunakan Chat SDK untuk JavaScript (@azure/communication-chat) 1.5.0 atau yang terbaru. Untuk informasi selengkapnya, lihat Pustaka klien Azure Communication Chat untuk JavaScript.
Sasaran
- Render lampiran file di utas pesan. Setiap kartu lampiran file memiliki tombol Buka .
- Merender lampiran gambar sebagai gambar sebaris.
Menangani lampiran file
SDK Obrolan untuk JavaScript mengembalikan ChatAttachmentType
properti file
untuk lampiran file reguler dan image
untuk gambar yang di-inlin pesan.
export interface ChatMessageReceivedEvent extends BaseChatMessageEvent {
/**
* Content of the message.
*/
message: string;
/**
* Chat message attachment.
*/
attachments?: ChatAttachment[];
...
}
export interface ChatAttachment {
/** Id of the attachment */
id: string;
/** The type of attachment. */
attachmentType: AttachmentType;
/** The name of the attachment content. */
name?: string;
/** The URL that is used to provide the original size of the inline images */
url?: string;
/** The URL that provides the preview of the attachment */
previewUrl?: string;
}
/** Type of supported attachments. */
export type ChatAttachmentType = "image" | "file" | "unknown";
Misalnya, JSON berikut menunjukkan seperti apa ChatAttachment
tampilan lampiran gambar dan lampiran file:
"attachments": [
{
"id": "08a182fe-0b29-443e-8d7f-8896bc1908a2",
"attachmentType": "file",
"name": "business report.pdf",
"previewUrl": "https://contoso.sharepoint.com/:u:/g/user/h8jTwB0Zl1AY"
},
{
"id": "9d89acb2-c4e4-4cab-b94a-7c12a61afe30",
"attachmentType": "image",
"name": "Screenshot.png",
"url": "https://contoso.communication.azure.com/chat/threads/19:9d89acb29d89acb2@thread.v2/messages/123/images/9d89acb2-c4e4-4cab-b94a-7c12a61afe30/views/original?api-version=2023-11-15-preview",
"previewUrl": "https://contoso.communication.azure.com/chat/threads/19:9d89acb29d89acb2@thread.v2/messages/123/images/9d89acb2-c4e4-4cab-b94a-7c12a61afe30/views/small?api-version=2023-11-15-preview"
}
]
Sekarang mari kita kembali ke penanganan aktivitas yang Anda buat di Mulai Cepat: Bergabunglah dengan aplikasi Obrolan Anda ke rapat Teams dan tambahkan beberapa logika tambahan untuk menangani lampiran dengan attachmentType
properti file
:
chatClient.on("chatMessageReceived", (e) => {
console.log("Notification chatMessageReceived!");
// Check whether the notification is intended for the current thread
if (threadIdInput.value != e.threadId) {
return;
}
if (e.sender.communicationUserId != userId) {
renderReceivedMessage(e);
} else {
renderSentMessage(e.message);
}
});
async function renderReceivedMessage(event) {
messages += `<div class="container lighter"> ${event.message} </div>`;
messagesContainer.innerHTML = messages;
// Get the list of attachments and calls renderFileAttachments to construct a file attachment card
var attachmentHtml = event.attachments
.filter(attachment => attachment.attachmentType === "file")
.map(attachment => renderFileAttachments(attachment))
.join('');
messagesContainer.innerHTML += attachmentHtml;
}
function renderFileAttachments(attachment) {
var re = /(?:\.([^.]+))?$/;
var fileExtension = re.exec(attachment.name)[1];
return '<div class="attachment-container">' +
'<img class="attachment-icon" alt="attachment file icon" />' +
'<div>' +
'<p class="attachment-type">' + fileExtension + '</p>' +
'<p>' + attachment.name + '</p>' +
'<a href=' + attachment.previewUrl + ' target="_blank" rel="noreferrer">Open</a>' +
'</div>' +
'</div>';
}
Pastikan Anda menambahkan beberapa CSS untuk kartu lampiran:
/* Let's make the chat popup scrollable */
.chat-popup {
...
max-height: 650px;
overflow-y: scroll;
}
.attachment-container {
overflow: hidden;
background: #f3f2f1;
padding: 20px;
margin: 0;
border-radius: 10px;
}
.attachment-container img {
width: 50px;
height: 50px;
float: left;
margin: 0;
}
.attachment-container p {
font-weight: 700;
margin: 0 5px 20px 0;
}
.attachment-container {
display: grid;
grid-template-columns: 100px 1fr;
margin-top: 5px;
}
.attachment-icon {
content: url("data:image/svg+xml;base64, ...");
}
.attachment-container a {
background-color: #dadada;
color: black;
font-size: 12px;
padding: 10px;
border: none;
cursor: pointer;
border-radius: 5px;
text-align: center;
margin-right: 10px;
text-decoration: none;
margin-top: 10px;
}
.attachment-container a:hover {
background-color: black;
color: white;
}
.attachment-type {
position: absolute;
color: black;
border: 2px solid black;
background-color: white;
margin-top: 50px;
font-family: sans-serif;
font-weight: 400;
padding: 2px;
text-transform: uppercase;
font-size: 8px;
}
Itu saja yang Anda butuhkan untuk menangani lampiran file. Selanjutnya, mari kita jalankan kodenya.
Menjalankan kode
Untuk webpack, Anda dapat menggunakan webpack-dev-server
properti untuk membuat dan menjalankan aplikasi Anda. Jalankan perintah berikut untuk menggabungkan host aplikasi Anda di server web lokal:
npx webpack-dev-server --entry ./client.js --output bundle.js --debug --devtool inline-source-map
Atau:
npm start
Demo lampiran file
Buka browser Anda, dan buka
http://localhost:8080/
. Masukkan URL rapat dan ID utas.Kirim beberapa lampiran file dari klien Teams.
Anda akan melihat pesan baru yang dirender bersama dengan lampiran file.
Menangani lampiran gambar
Lampiran gambar perlu diperlakukan secara berbeda dari lampiran standar file
. Lampiran gambar memiliki attachmentType
properti image
, yang memerlukan token komunikasi untuk mengambil pratinjau atau gambar ukuran penuh.
Sebelum melanjutkan, selesaikan tutorial yang menunjukkan cara mengaktifkan dukungan gambar sebaris di aplikasi Obrolan Anda. Tutorial ini menjelaskan cara mengambil gambar yang memerlukan token komunikasi di header permintaan. Setelah menerima blob gambar, Anda perlu membuat ObjectUrl
properti yang menunjuk ke blob ini. Kemudian Anda menyuntikkan URL ini ke src
dalam atribut setiap gambar sebaris.
Sekarang setelah Anda terbiasa dengan cara kerja gambar sebaris, Anda dapat merender lampiran gambar seperti gambar sebaris biasa.
Pertama, masukkan image
tag ke dalam konten pesan setiap kali ada lampiran gambar:
async function renderReceivedMessage(event) {
messages += `<div class="container lighter"> ${event.message} </div>`;
messagesContainer.innerHTML = messages;
console.log(event);
// Filter out inline images from attachments
const imageAttachments = event.attachments?.filter(
(attachment) =>
attachment.attachmentType === "image" && !messages.includes(attachment.id)
);
// Inject image tag for all image attachments
var imageAttachmentHtml =
imageAttachments
.map((attachment) => renderImageAttachments(attachment))
.join("") ?? "";
messagesContainer.innerHTML += imageAttachmentHtml;
// Get list of attachments and calls renderFileAttachments to construct a file attachment card
var attachmentHtml =
event.attachments
?.filter((attachment) => attachment.attachmentType === "file")
.map((attachment) => renderFileAttachments(attachment))
.join("") ?? "";
messagesContainer.innerHTML += attachmentHtml;
// Fetch and render preview images
fetchPreviewImages(imageAttachments);
}
function renderImageAttachments(attachment) {
return `<img alt="image" src="" itemscope="png" id="${attachment.id}" style="max-width: 100px">`
}
Sekarang, mari kita pinjam fetchPreviewImages()
dari Tutorial: Aktifkan dukungan gambar sebaris dan gunakan apa adanya tanpa perubahan apa pun:
function fetchPreviewImages(attachments) {
if (!attachments.length > 0) {
return;
}
Promise.all(
attachments.map(async (attachment) => {
const response = await fetch(attachment.previewUrl, {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + tokenString,
},
});
return {
id: attachment.id,
content: await response.blob(),
};
}),
).then((result) => {
result.forEach((imageRef) => {
const urlCreator = window.URL || window.webkitURL;
const url = urlCreator.createObjectURL(imageRef.content);
document.getElementById(imageRef.id).src = url;
});
}).catch((e) => {
console.log('error fetching preview images');
});
}
Fungsi ini memerlukan tokenString
properti, jadi Anda memerlukan salinan global yang diinisialisasi di init()
, seperti yang ditunjukkan dalam cuplikan kode berikut:
var tokenString = '';
async function init() {
...
const {
token,
expiresOn
} = tokenResponse;
tokenString = token;
...
}
Sekarang Anda memiliki dukungan lampiran gambar. Lanjutkan menjalankan kode dan melihatnya dalam tindakan.
Demo lampiran gambar
Kirim beberapa lampiran gambar dari klien Teams.
Setelah Anda mengirim lampiran gambar, perhatikan bahwa lampiran tersebut menjadi gambar sebaris di sisi klien Teams.
Kembali ke aplikasi sampel dan pastikan gambar yang sama dirender.
Tutorial ini menjelaskan cara mengaktifkan dukungan lampiran file dengan menggunakan Azure Communication Services Chat SDK untuk C#.
Dalam tutorial ini, Anda akan mempelajari cara:
- Menangani lampiran file.
- Menangani lampiran gambar.
Prasyarat
- Tinjau mulai cepat Bergabung dengan aplikasi Obrolan Anda ke rapat Teams.
- Buat sumber daya Azure Communication Services seperti yang dijelaskan dalam Membuat sumber daya Azure Communication Services. Anda perlu merekam string koneksi Anda untuk tutorial ini.
- Siapkan rapat Teams dengan menggunakan akun bisnis Anda dan siapkan URL rapat.
- Unduh Chat SDK untuk C# (@azure/communication-chat) 1.3.0 atau yang terbaru. Untuk informasi selengkapnya, lihat Pustaka klien Azure Communication Chat.
Kode Sampel
Temukan kode akhir untuk tutorial ini di GitHub.
Menangani lampiran file
Chat SDK untuk C# mengembalikan ChatAttachmentType
properti file
untuk lampiran file reguler dan image
untuk gambar sebaris.
public readonly partial struct ChatAttachmentType : IEquatable<ChatAttachmentType>
{
private const string ImageValue = "image";
private const string FileValue = "file";
/// <summary> image. </summary>
public static ChatAttachmentType Image { get; } = new ChatAttachmentType(ImageValue);
/// <summary> file. </summary>
public static ChatAttachmentType File { get; } = new ChatAttachmentType(FileValue);
}
Misalnya, JSON berikut menunjukkan seperti apa ChatAttachment
tampilan lampiran gambar dan lampiran file saat Anda menerima permintaan dari sisi server:
"attachments": [
{
"id": "08a182fe-0b29-443e-8d7f-8896bc1908a2",
"attachmentType": "file",
"name": "business report.pdf",
"previewUrl": "https://contoso.sharepoint.com/:u:/g/user/h8jTwB0Zl1AY"
},
{
"id": "9d89acb2-c4e4-4cab-b94a-7c12a61afe30",
"attachmentType": "image",
"name": "Screenshot.png",
"url": "https://contoso.communication.azure.com/chat/threads/19:9d89acb29d89acb2@thread.v2/messages/123/images/9d89acb2-c4e4-4cab-b94a-7c12a61afe30/views/original?api-version=2023-11-15-preview",
"previewUrl": "https://contoso.communication.azure.com/chat/threads/19:9d89acb29d89acb2@thread.v2/messages/123/images/9d89acb2-c4e4-4cab-b94a-7c12a61afe30/views/small?api-version=2023-11-15-preview"
}
]
Sekarang kembali ke penanganan aktivitas yang Anda buat di mulai cepat sebelumnya dan tambahkan beberapa logika tambahan untuk menangani lampiran dengan ChatAttachmentType
properti :file
await foreach (ChatMessage message in allMessages)
{
// Get message attachments that are of type 'file'
IEnumerable<ChatAttachment> fileAttachments = message.Content.Attachments.Where(x => x.AttachmentType == ChatAttachmentType.File);
var chatAttachmentFileUris = new List<Uri>();
foreach (var file in fileAttachments)
{
chatAttachmentFileUris.Add(file.PreviewUri);
}
// Build message list
if (message.Type == ChatMessageType.Html || message.Type == ChatMessageType.Text)
{
textMessages++;
var userPrefix = message.Sender.Equals(currentUser) ? "[you]:" : "";
var strippedMessage = StripHtml(message.Content.Message);
var chatAttachments = fileAttachments.Count() > 0 ? "[Attachments]:\n" + string.Join(",\n", chatAttachmentFileUris) : "";
messageList.Add(long.Parse(message.SequenceId), $"{userPrefix}{strippedMessage}\n{chatAttachments}");
}
}
Secara khusus, untuk setiap lampiran file, Anda mendapatkan previewUrl
properti dan membuat daftar URL di for loop
. Kemudian Anda menyematkan string bersama dengan konten pesan Obrolan.
Menangani lampiran gambar
Anda perlu menangani lampiran gambar secara berbeda dari lampiran standar file
. Lampiran gambar memiliki ChatAttachmentType
properti image
, yang memerlukan token komunikasi untuk mengambil pratinjau atau gambar ukuran penuh.
Sebelum melanjutkan, selesaikan tutorial Aktifkan dukungan gambar sebaris. Untuk melampirkan gambar identitas, Anda perlu mencari tahu apakah konten pesan berisi ID gambar yang sama dari lampiran.
bool isImageAttachment = message.Content.Message.Contains(x.Id);
Jika bendera ini benar, maka Anda menerapkan logika gambar sebaris untuk merendernya:
IEnumerable<ChatAttachment> imageAttachments = message.Content.Attachments.Where(x => x.AttachmentType == ChatAttachmentType.Image);
// Fetch image and render
var chatAttachmentImageUris = new List<Uri>();
foreach (ChatAttachment imageAttachment in imageAttachments)
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", communicationTokenCredential.GetToken().Token);
var response = await client.GetAsync(imageAttachment.PreviewUri);
var randomAccessStream = await response.Content.ReadAsStreamAsync();
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
var bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(randomAccessStream.AsRandomAccessStream());
InlineImage.Source = bitmapImage;
});
chatAttachmentImageUris.Add(imageAttachment.PreviewUri);
}
Sekarang aplikasi Anda mendukung lampiran gambar.
Langkah berikutnya
- Pelajari selengkapnya tentang cara mengaktifkan dukungan gambar sebaris.
- Pelajari selengkapnya tentang fitur interoperabilitas lain yang didukung.
- Lihat sampel hero Obrolan kami.
- Pelajari selengkapnya tentang cara kerja Obrolan.