Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Liferay Portal は、Web ポータルおよび Web サイトの開発用に設計されたオープンソースのエンタープライズ ポータル ソフトウェア プラットフォームです。 Liferay は、ポータル プラットフォームの一部としてドキュメント管理システムを提供し、ユーザーが協力的かつ効率的な方法でドキュメントを作成、整理、保存、管理できるようにします。このドキュメント管理機能は、Liferay ドキュメント ライブラリと呼ばれることがよくあります。
この記事では、「ドキュメントとメディア」ライブラリのルートにアップロードされたドキュメントを比較し、結果のドキュメントをアップロードして戻す一般的なシナリオについて説明します。
Docker を実行して、新しい Liferay ポータル インスタンスを開始します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.92-ga92
Docker がない場合は、最初に インストールしてください を使用します。 別のバージョンの Liferay ポータル ドッカー を使用することもできます。
電子メール アドレス test@liferay.com とパスワード test を使用して Liferay にサインインします。
プロンプトが表示されたら、パスワードを変更します。
このチュートリアル を使用してサイト ID を取得します。
Aspose.Words ライセンスを購入するか、ライセンスとサブスクリプション を使用します。
Aspose.Words for .NET が Liferay ドキュメントおよびメディア ライブラリとどのように連携するかを評価するには、適切な設定でコンソール アプリケーションを作成し、ドキュメントをドキュメントおよびメディア ライブラリのルートにアップロードし、これらのドキュメントをダウンロードして処理するためのロジックを実装する必要があります。結果をドキュメントとメディア ライブラリのルートにアップロードして戻します。これを行うには、このセクションで説明されている手順に従ってください。
命令を実行するには、次の変数の値を見つけて修正する必要があります。これらの変数は、「プリセット」部分の手順を完了すると利用可能になります。
新しいコンソール アプリケーション プロジェクトを作成するには、次の手順に従います。
Newtonsoft.Jsonプロジェクト内に「Docs」フォルダーを作成し、「DocumentA.docx」および「DocumentA.docx」ファイルを追加します。
プロジェクト内に「JsonModel」フォルダーを作成します。プロジェクト内にファイル「DownloadResponse.cs」を作成し、次の内容を入力します。
.NET
using Newtonsoft.Json;
namespace LiferayExample.JsonModel
{
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class DownloadResponse
{
[JsonProperty(PropertyName = "contentValue")]
public string ContentValue { get; set; }
}
}
プロジェクト内にファイル「FileMetadata.cs」を作成し、次の内容を入力します。
.NET
using Newtonsoft.Json;
namespace LiferayExample.JsonModel
{
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class FileMetadata
{
[JsonProperty(PropertyName = "siteId")]
public string SiteId { get; set; }
[JsonProperty(PropertyName = "sizeInBytes")]
public int SizeInBytes { get; set; }
[JsonProperty(PropertyName = "fileName")]
public string FileName { get; set; }
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
}
}
プロジェクト内にファイル「UploadResponse.cs」を作成し、次の内容を入力します。
.NET
using Newtonsoft.Json;
namespace LiferayExample.JsonModel
{
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class UploadResponse : FileMetadata { }
}
プロジェクト内にファイル「GetFileInfoByNameResponse.cs」を作成し、次の内容を入力します。
.NET
using Newtonsoft.Json;
namespace LiferayExample.JsonModel
{
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class GetFileInfoByNameResponse
{
[JsonProperty(PropertyName = "items")]
public FileMetadata[] FilesData { get; set; }
}
}
プロジェクト内にファイル「SecurityContext.cs」を作成し、次の内容を入力します。
.NET
namespace LiferayExample
{
public record SecurityContext(string SiteId, string Login, string Password);
}
プロジェクト内にファイル「DocumentClient.cs」を作成し、次の内容を入力します。
.NET
using Newtonsoft.Json;
using LiferayExample.JsonModel;
namespace LiferayExample
{
/// <summary>
/// Implements logic to communicate with Liferay over REST requests.
/// </summary>
public sealed class DocumentClient : IDisposable
{
private readonly string _portalBaseUrl;
private readonly HttpClient _httpClient;
private readonly SecurityContext _context;
private string _className => nameof(DocumentClient);
private string _documentAPIUrl => $"{_portalBaseUrl}/o/headless-delivery/v1.0";
/// <summary>
/// Client constructor.
/// </summary>
public DocumentClient(string portalBaseUrl, SecurityContext context)
{
_context = context;
_portalBaseUrl = portalBaseUrl;
_httpClient = new HttpClient();
}
/// <summary>
/// Uploads the file to "Documents and Media" root folder with specified name.
/// </summary>
/// <remarks>
/// Overrides the file with the same name in Liferay.
/// </remarks>
public async Task<UploadResponse> Upload(Stream file, string fileName)
{
var fileInfo = await GetFileInfoByName(fileName);
if (fileInfo != null)
await DeleteDocument(fileInfo.Id);
var uploadFileUrl = $"{_documentAPIUrl}/sites/{_context.SiteId}/documents";
using var request = GetApiRequest(HttpMethod.Post, uploadFileUrl);
using var formContent = new MultipartFormDataContent
{
{ new StreamContent(file), "file", fileName }
};
request.Content = formContent;
using var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
var uploadResponse = JsonConvert.DeserializeObject<UploadResponse>(responseJson);
if (uploadResponse == null)
throw new Exception($"{_className}.{nameof(Upload)}: Unexpected response format: {responseJson}.");
return uploadResponse;
}
/// <summary>
/// Downloads document from "Documents and Media" library.
/// </summary>
public async Task<Stream> Download(string fileId)
{
var downloadFileUrl =
$"{_documentAPIUrl}/documents/{fileId}?nestedFields=contentValue&fields=contentValue";
using var request = GetApiRequest(HttpMethod.Get, downloadFileUrl);
using var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
var downloadResponse = JsonConvert.DeserializeObject<DownloadResponse>(responseJson);
if (string.IsNullOrWhiteSpace(downloadResponse?.ContentValue))
throw new Exception($"{_className}.{nameof(Download)}: Unexpected response format: {responseJson}.");
var fileData = Convert.FromBase64String(downloadResponse.ContentValue);
if (fileData == null)
throw new Exception($"{_className}.{nameof(Download)}: Can not convert received data to binary array.");
return new MemoryStream(fileData);
}
/// <summary>
/// Disposes client resources.
/// </summary>
public void Dispose()
{
_httpClient?.Dispose();
}
private async Task<FileMetadata> GetFileInfoByName(string fileName)
{
var getFileUrl = $"{_documentAPIUrl}/sites/{_context.SiteId}/documents?search={Uri.EscapeDataString($"{fileName}")}";
using var request = GetApiRequest(HttpMethod.Get, getFileUrl);
using var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
var fileInfos = JsonConvert.DeserializeObject<GetFileInfoByNameResponse>(responseJson);
if (fileInfos?.FilesData == null)
throw new Exception($"{_className}.{nameof(GetFileInfoByName)}: Unexpected response format: {responseJson}.");
var fileData = fileInfos.FilesData
.FirstOrDefault(info => info.FileName.Equals(fileName, StringComparison.InvariantCultureIgnoreCase));
return fileData;
}
private async Task DeleteDocument(string fileId)
{
var deleteFileUrl = $"{_documentAPIUrl}/documents/{fileId}";
using var request = GetApiRequest(HttpMethod.Delete, deleteFileUrl);
using var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
}
private HttpRequestMessage GetApiRequest(HttpMethod httpMethod, string requestUrl)
{
var request = new HttpRequestMessage(httpMethod, requestUrl);
request.Headers.Authorization = new BasicAuthenticationHeaderValue(_context.Login, _context.Password);
return request;
}
}
}
次の内容を「Program.cs」ファイルに移動します。
.NET
using Aspose.Words;
using LiferayExample;
try
{
await RunCodeExample();
}
catch(Exception ex)
{
Console.WriteLine($"Failed to execute code example: {ex}");
}
static async Task RunCodeExample()
{
// Settings.
const string siteId = "TODO"; // For example: 20119
const string login = "TODO"; // For example test@liferay.com
const string password = "TODO"; // Fill actual password for the "test@liferay.com" user.
const string basePortalUrl = "TODO"; // For example: http://localhost:8080
const string asposeWordsLicensePath = "TODO"; // For example: Aspose.Words.NET.lic
const string fileA = "DocumentA.docx";
const string fileB = "DocumentB.docx";
const string fileCompared = "DocumentCompared.docx";
// Set licenses.
License lic = new License();
lic.SetLicense(asposeWordsLicensePath);
// Logic of the scenario.
Console.WriteLine("Code example started.");
var client = new DocumentClient(basePortalUrl, new SecurityContext(siteId, login, password));
var fileAUploadData = await client.Upload(File.OpenRead($"./Docs/{fileA}"), fileA);
Console.WriteLine($"\"{fileAUploadData.FileName}\" uploaded successfully. Assigned identifier is \"{fileAUploadData.Id}\".");
var fileBUploadData = await client.Upload(File.OpenRead($"./Docs/{fileB}"), fileB);
Console.WriteLine($"\"{fileBUploadData.FileName}\" uploaded successfully. Assigned identifier is \"{fileBUploadData.Id}\".");
var fileAData = await client.Download(fileAUploadData.Id);
Console.WriteLine($"\"{fileAUploadData.FileName}\" downloaded successfully.");
var fileBData = await client.Download(fileBUploadData.Id);
Console.WriteLine($"\"{fileBUploadData.FileName}\" downloaded successfully.");
var docA = new Document(fileAData);
var docB = new Document(fileBData);
docA.Compare(docB, "Aspose", DateTime.Now);
Console.WriteLine($"Documents compared successfully.");
using var comparedDocument = new MemoryStream();
docA.Save(comparedDocument, SaveFormat.Docx);
comparedDocument.Seek(0, SeekOrigin.Begin);
var fileComparedUploadData = await client.Upload(comparedDocument, fileCompared);
Console.WriteLine($"Comparison result \"{fileComparedUploadData.FileName}\" uploaded successfully. Assigned identifier is \"{fileComparedUploadData.Id}\".");
Console.WriteLine("Code example completed.");
}
最後に、作成した例を実行して、得られた結果を確認します。
その結果、「Document Compare.docx」ファイルはドキュメントとメディア ライブラリのルートに配置される必要があります。
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.