Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Внимание
Эта функция Службы коммуникации Azure сейчас доступна в предварительной версии. Функции в предварительной версии общедоступны и могут использоваться всеми новыми и существующими клиентами Майкрософт.
Предварительные версии API и пакеты SDK предоставляются без соглашения об уровне обслуживания. Мы рекомендуем не использовать их для задач в условиях эксплуатации. Некоторые функции могут не поддерживаться или могут быть ограничены.
Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В Службы коммуникации Azure чате мы можем включить общий доступ к файлам между пользователями связи. Чат служб коммуникации Azure отличается от чата взаимодействия Teams или Interop Chat. Если вы хотите включить общий доступ к файлам в чате взаимодействия, см. статью "Добавление общего доступа к файлам с библиотекой пользовательского интерфейса" в чате взаимодействия Teams.
В этой статье описывается, как настроить композит чата библиотеки пользовательского интерфейса Служб коммуникации Azure для разрешения обмена файлами. Библиотека UI: Композитный чат предоставляет набор расширенных компонентов и элементов управления пользовательским интерфейсом, которые можно использовать для обеспечения обмена файлами. Мы используем Хранилище BLOB-объектов Azure, чтобы обеспечить хранение файлов, которые передаются через переписку в чате.
Внимание
Службы коммуникации Azure не предоставляет службу хранилища файлов. Для общего доступа к файлам необходимо использовать собственную службу хранилища файлов. В этом руководстве описывается использование хранилища BLOB-объектов Azure.
Скачать код
Доступ к полному коду этого учебника можно получить на странице Пример библиотеки пользовательского интерфейса — обмен файлами с использованием UI Chat Composite. Если вы хотите использовать общий доступ к файлам с помощью компонентов пользовательского интерфейса, см. пример библиотеки пользовательского интерфейса . Общий доступ к файлам с помощью компонентов пользовательского интерфейса.
Предварительные условия
- Учетная запись Azure с активной подпиской. Дополнительные сведения см. в статье "Создание учетной записи бесплатно".
- Visual Studio Code на одной из поддерживаемых платформ.
-
Node.js, Активные версии LTS и обслуживаемые версии LTS (рекомендуется 10.14.1). Используйте команду
node --version
, чтобы проверить установленную версию. - Активный ресурс службы связи и строка подключения. Создайте ресурс служб коммуникации.
Чтобы использовать эту статью, необходимо знать, как настроить и запустить составной чат. Дополнительные сведения о настройке и запуске составного чата см. в руководстве по ChatComposite.
Обзор
Составной чат библиотеки пользовательского интерфейса поддерживает общий доступ к файлам, позволяя разработчикам передавать URL-адрес размещенного файла, который отправляется через службу чата Службы коммуникации Azure. Библиотека пользовательского интерфейса отрисовывает вложенный файл и поддерживает различные расширения, чтобы настроить внешний вид отправленного файла. В частности, он поддерживает следующие функции:
- Кнопка "Присоединить файл" для выбора файлов с помощью средства выбора файлов операционной системы.
- Настройка разрешенных расширений файлов.
- Включить/отключить возможность нескольких загрузок.
- Значки файлов для различных типов файлов.
- Карточки отправки и скачивания файлов с индикаторами хода выполнения.
- Возможность динамической проверки каждой отправки и отображения ошибок в пользовательском интерфейсе.
- Возможность отмены отправки и удаления отправленного файла перед отправкой.
- Просмотрите загруженные файлы в MessageThread, скачайте их. Разрешает асинхронные загрузки.
На следующей схеме показан типичный поток сценария общего доступа к файлам для отправки и скачивания. Раздел, отмеченный как Client Managed
, показывает строительные блоки, которые разработчикам нужно реализовать.
Настройка хранилища файлов с помощью Azure Blob
Вы можете следовать руководству по отправке файла в хранилище BLOB-объектов Azure с помощью функции Azure , чтобы записать внутренний код, необходимый для общего доступа к файлам.
После реализации эту функцию Azure можно вызвать внутри handleAttachmentSelection
функции для отправки файлов в Хранилище BLOB-объектов Azure. В оставшейся части руководства мы предполагаем, что вы создали функцию, используя ранее связанное руководство по хранилищу объектов Blob Azure.
Защита контейнера хранилища блоб-объектов Azure
В этой статье предполагается, что контейнер хранилища BLOB-объектов Azure разрешает общедоступный доступ к отправленным файлам. Предоставление общедоступных контейнеров хранилища Azure не рекомендуется для реальных рабочих приложений.
Для скачивания файлов сначала загружайте их в хранилище BLOB-объектов Azure. Затем можно использовать подписи для общего доступа (SAS). Подпись общего доступа (SAS) предоставляет защищенный делегированный доступ к ресурсам в учетной записи хранения. С помощью SAS вы можете детально контролировать процесс получения клиентом доступа к данным.
Скачиваемый пример GitHub демонстрирует использование SAS для создания URL-адресов SAS к содержимому хранилища Azure. Кроме того, вы можете ознакомиться с дополнительными сведениями о SAS.
Библиотека пользовательского интерфейса требует настройки среды React. Далее мы делаем это. Если у вас уже есть приложение React, вы можете пропустить этот раздел.
Настройка приложения React
Мы используем шаблон create-react-app для этого быстрого старта. Дополнительные сведения см. в статье "Начало работы с React"
npx create-react-app ui-library-quickstart-composites --template typescript
cd ui-library-quickstart-composites
Завершив этот процесс, вы должны увидеть полностью развернутое приложение в папке ui-library-quickstart-composites
.
В этом кратком руководстве мы изменяем файлы в папке src
.
Установка пакета
npm install
Используйте команду, чтобы установить бета-версию библиотеки пользовательского интерфейса Службы коммуникации Azure для JavaScript.
npm install @azure/[email protected]
@azure/communication-react
указывает основные Службы коммуникации Azure, peerDependencies
чтобы обеспечить наиболее согласованное использование API из основных библиотек в приложении. Эти библиотеки также необходимо установить:
npm install @azure/[email protected]
npm install @azure/[email protected]
Создание приложения React
Проверим установку "Создание приложения React", выполнив следующую команду:
npm run start
Настройка составного чата для включения общего доступа к файлам
Для инициализации составного компонента чата необходимо заменить значения для обеих общих переменных.
App.tsx
import { initializeFileTypeIcons } from '@fluentui/react-file-type-icons';
import {
ChatComposite,
AttachmentUploadTask,
AttachmentUploadOptions,
AttachmentSelectionHandler,
fromFlatCommunicationIdentifier,
useAzureCommunicationChatAdapter
} from '@azure/communication-react';
import React, { useMemo } from 'react';
initializeFileTypeIcons();
function App(): JSX.Element {
// Common variables
const endpointUrl = 'INSERT_ENDPOINT_URL';
const userId = ' INSERT_USER_ID';
const displayName = 'INSERT_DISPLAY_NAME';
const token = 'INSERT_ACCESS_TOKEN';
const threadId = 'INSERT_THREAD_ID';
// We can't even initialize the Chat and Call adapters without a well-formed token.
const credential = useMemo(() => {
try {
return new AzureCommunicationTokenCredential(token);
} catch {
console.error('Failed to construct token credential');
return undefined;
}
}, [token]);
// Memoize arguments to `useAzureCommunicationChatAdapter` so that
// a new adapter is only created when an argument changes.
const chatAdapterArgs = useMemo(
() => ({
endpoint: endpointUrl,
userId: fromFlatCommunicationIdentifier(userId) as CommunicationUserIdentifier,
displayName,
credential,
threadId
}),
[userId, displayName, credential, threadId]
);
const chatAdapter = useAzureCommunicationChatAdapter(chatAdapterArgs);
if (!!chatAdapter) {
return (
<>
<div style={containerStyle}>
<ChatComposite
adapter={chatAdapter}
options={{
attachmentOptions: {
uploadOptions: uploadOptions,
downloadOptions: downloadOptions,
}
}} />
</div>
</>
);
}
if (credential === undefined) {
return <h3>Failed to construct credential. Provided token is malformed.</h3>;
}
return <h3>Initializing...</h3>;
}
const uploadOptions: AttachmentUploadOptions = {
// default is false
disableMultipleUploads: false,
// define mime types
supportedMediaTypes: ["image/jpg", "image/jpeg"]
handleAttachmentSelection: attachmentSelectionHandler,
}
const attachmentSelectionHandler: AttachmentSelectionHandler = async (uploadTasks) => {
for (const task of uploadTasks) {
try {
const uniqueFileName = `${v4()}-${task.file?.name}`;
const url = await uploadFileToAzureBlob(task);
task.notifyUploadCompleted(uniqueFileName, url);
} catch (error) {
if (error instanceof Error) {
task.notifyUploadFailed(error.message);
}
}
}
}
const uploadFileToAzureBlob = async (uploadTask: AttachmentUploadTask) => {
// You need to handle the file upload here and upload it to Azure Blob Storage.
// This is how you can configure the upload
// Optionally, you can also update the file upload progress.
uploadTask.notifyUploadProgressChanged(0.2);
return {
url: 'https://sample.com/sample.jpg', // Download URL of the file.
};
Настройка метода отправки для использования хранилища BLOB-объектов Azure
Чтобы включить загрузку в Azure Blob Storage, мы изменим ранее объявленный метод uploadFileToAzureBlob
следующим кодом. Для отправки файлов необходимо заменить сведения о функции Azure.
App.tsx
const uploadFileToAzureBlob = async (uploadTask: AttachmentUploadTask) => {
const file = uploadTask.file;
if (!file) {
throw new Error("uploadTask.file is undefined");
}
const filename = file.name;
const fileExtension = file.name.split(".").pop();
// Following is an example of calling an Azure Function to handle file upload
// The https://learn.microsoft.com/azure/developer/javascript/how-to/with-web-app/azure-function-file-upload
// tutorial uses 'username' parameter to specify the storage container name.
// the container in the tutorial is private by default. To get default downloads working in
// this sample, you need to change the container's access level to Public via Azure Portal.
const username = "ui-library";
// You can get function url from the Azure Portal:
const azFunctionBaseUri = "<YOUR_AZURE_FUNCTION_URL>";
const uri = `${azFunctionBaseUri}&username=${username}&filename=${filename}`;
const formData = new FormData();
formData.append(file.name, file);
const response = await axios.request({
method: "post",
url: uri,
data: formData,
onUploadProgress: (p) => {
// Optionally, you can update the file upload progress.
uploadTask.notifyUploadProgressChanged(p.loaded / p.total);
},
});
const storageBaseUrl = "https://<YOUR_STORAGE_ACCOUNT>.blob.core.windows.net";
return {
url: `${storageBaseUrl}/${username}/${filename}`,
};
};
Обработка ошибок
При сбое загрузки в чатовой компоненте библиотеки пользовательского интерфейса отображается сообщение об ошибке.
Ниже приведен пример кода, показывающий, как загрузка может завершиться неудачей из-за ошибки проверки размера файла.
App.tsx
import { AttachmentSelectionHandler } from from '@azure/communication-react';
const attachmentSelectionHandler: AttachmentSelectionHandler = async (uploadTasks) => {
for (const task of uploadTasks) {
if (task.file && task.file.size > 99 * 1024 * 1024) {
// Notify ChatComposite about upload failure.
// Allows you to provide a custom error message.
task.notifyUploadFailed('File too big. Select a file under 99 MB.');
}
}
}
export const attachmentUploadOptions: AttachmentUploadOptions = {
handleAttachmentSelection: attachmentSelectionHandler
};
Скачивание файлов — расширенное использование
По умолчанию библиотека пользовательского интерфейса открывает новую вкладку, указывающую на URL-адрес, заданный при выполнении notifyUploadCompleted
. Кроме того, можно использовать пользовательскую логику для обработки загрузки вложений с помощью actionsForAttachment
. Рассмотрим пример.
App.tsx
import { AttachmentDownloadOptions } from "communication-react";
const downloadOptions: AttachmentDownloadOptions = {
actionsForAttachment: handler
}
const handler = async (attachment: AttachmentMetadata, message?: ChatMessage) => {
// here we are returning a static action for all attachments and all messages
// alternately, you can provide custom menu actions based on properties in `attachment` or `message`
return [defaultAttachmentMenuAction];
};
const customHandler = = async (attachment: AttachmentMetadata, message?: ChatMessage) => {
if (attachment.extension === "pdf") {
return [
{
title: "Custom button",
icon: (<i className="custom-icon"></i>),
onClick: () => {
return new Promise((resolve, reject) => {
// custom logic here
window.alert("custom button clicked");
resolve();
// or to reject("xxxxx") with a custom message
})
}
},
defaultAttachmentMenuAction
];
} else if (message?.senderId === "user1") {
return [
{
title: "Custom button 2",
icon: (<i className="custom-icon-2"></i>),
onClick: () => {
return new Promise((resolve, reject) => {
window.alert("custom button 2 clicked");
resolve();
})
}
},
// you can also override the default action partially
{
...defaultAttachmentMenuAction,
onClick: () => {
return new Promise((resolve, reject) => {
window.alert("default button clicked");
resolve();
})
}
}
];
}
}
Если во время скачивания возникли какие-либо проблемы, и пользователя нужно уведомить, вы можете throw
вызвать ошибку с сообщением в onClick
функции. Затем сообщение отображается в строке ошибок в верхней части составного чата.
Очистка ресурсов
Если вы хотите отменить и удалить подписку на Службы коммуникации, можно удалить ресурс или группу ресурсов. При удалении группы ресурсов также удаляются все связанные с ней ресурсы. Дополнительные сведения о очистке ресурсов Служб коммуникации Azure и очистке ресурсов функций Azure.
Следующие шаги
Связанные статьи
- Добавление чата в приложение
- Создание маркеров доступа пользователей
- Сведения об архитектуре клиента и сервера
- Сведения о проверке подлинности
- Добавление функции обмена файлами с библиотекой пользовательского интерфейса в чате интероперабельности Teams
- Добавление общего доступа к файлам с помощью библиотеки пользовательского интерфейса в чате Служб коммуникации Azure
- Добавление встроенного образа с помощью библиотеки пользовательского интерфейса в чате взаимодействия Teams