Save Documents to Google Drive in ASP.NET Core DOCX Editor
27 Aug 20269 minutes to read
To save a document to Google Drive, follow these steps:
Step 1: Set up Google Drive API
You must set up a project in the Google Developers Console and enable the Google Drive API. Obtain the necessary credentials to access the API. For more information, refer to the official Enable the Drive API guide.
Step 2: Create a Simple DOCX Editor Sample in ASP.NET Core
Follow the steps in this link to create a simple DOCX Editor sample in ASP.NET Core. This will give you a basic setup of the DOCX Editor component.
Step 3: Modify the DocumentEditorController.cs File in the Web Service Project
-
Open the
DocumentEditorController.csfile in your web service project. -
Import the required namespaces at the top of the file:
using System.IO;
using Google.Apis.Drive.v3;
using Google.Apis.Util.Store;- Add the following private fields and a constructor to the
DocumentEditorControllerclass. In the constructor, assign the configuration values to the corresponding fields.
private IWebHostEnvironment _hostingEnvironment;
private IMemoryCache _cache;
private IConfiguration _configuration;
public readonly string folderId;
public readonly string applicationName;
public readonly string credentialPath;
private static readonly string[] Scopes = { DriveService.Scope.DriveFile, DriveService.Scope.DriveReadonly};
public DocumentEditorController(IWebHostEnvironment hostingEnvironment, IMemoryCache cache, IConfiguration configuration)
{
_hostingEnvironment = hostingEnvironment;
_cache = cache;
_configuration = configuration;
folderId = _configuration.GetValue<string>("FolderId");
credentialPath = _configuration.GetValue<string>("CredentialPath");
applicationName = _configuration.GetValue<string>("ApplicationName");
}- Create the
SaveToGoogleDrive()method to save the document to Google Drive
[AcceptVerbs("Post")]
[HttpPost]
[EnableCors("AllowAllOrigins")]
[Route("SaveToGoogleDrive")]
//Post action for saving the document to Google Drive
public void SaveToGoogleDrive(IFormCollection data)
{
if (data.Files.Count == 0)
return;
IFormFile file = data.Files[0];
string documentName = this.GetValue(data, "documentName");
string result = Path.GetFileNameWithoutExtension(documentName);
string fileName = result + "_downloaded.docx";
UserCredential credential;
using (var memStream = new FileStream(credentialPath, FileMode.Open, FileAccess.Read))
{
string credPath = "token.json";
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(memStream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true));
}
// Create the Drive API service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = applicationName,
});
var fileMetadata = new Google.Apis.Drive.v3.Data.File()
{
Name = fileName,
Parents = new List<string> { folderId }
};
Stream stream = new MemoryStream();
file.CopyTo(stream);
stream.Position = 0;
FilesResource.CreateMediaUpload request;
request = service.Files.Create(fileMetadata, stream, "application/pdf");
request.Fields = "id";
object value = await request.UploadAsync();
}- Add the following helper method
GetValueto theDocumentEditorControllerclass to read form values from the posted data
private string GetValue(IFormCollection data, string key)
{
if (data.ContainsKey(key))
{
string[] values = data[key];
if (values.Length > 0)
{
return values[0];
}
}
return "";
}- Open the
appsettings.jsonfile in your web service project. Add the following lines below the existing"AllowedHosts"configuration
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"FolderId": "Your Google Drive Folder ID",
"CredentialPath": "Your Path to the OAuth 2.0 Client IDs json file",
"ApplicationName": "Your Application name"
}Replace Your Google Drive Folder ID, Your Application name, and Your Path to the OAuth 2.0 Client IDs json file with your actual Google Drive folder ID, your application name, and the path to the JSON file.
The FolderId is the unique identifier for the folder. For example, if your folder URL is
https://drive.google.com/drive/folders/abc123xyz456, then the folder ID isabc123xyz456.
The JSON file (
credentials.json) downloaded from the Google Cloud Console contains your OAuth 2.0 Client ID and Client Secret. Use these credentials to interface your application with the Google Drive API.
Step 4: Modify the Index.cshtml File in the DOCX Editor sample
On the client side, export the document to a blob using saveAsBlob and send it to the server for saving in Google Drive.
<ejs-button id="export">Save to Google Drive</ejs-button>
<ejs-documenteditorcontainer id="container"></ejs-documenteditorcontainer>
<script>
var documenteditor;
document.addEventListener('DOMContentLoaded', function () {
var documenteditorElement = document.getElementById("container");
container = documenteditorElement.ej2_instances[0];
document.getElementById('export').addEventListener('click', function () {
container.documentEditor.saveAsBlob('Docx').then((blob) => {
var exportedDocument = blob;
//Now, save the document where ever you want.
var formData = new FormData();
formData.append('documentName', container.documentEditor.documentName);
formData.append('data', exportedDocument);
/* tslint:disable */
var req = new XMLHttpRequest();
// Replace your running Url here
req.open(
'POST',
window.baseurl + 'api/documenteditor/SaveToGoogleDrive',
true
);
req.onreadystatechange = () => {
if (req.readyState === 4) {
if (req.status === 200 || req.status === 304) {
console.log('Saved sucessfully');
}
}
};
req.send(formData);
});
});
});
</script>public ActionResult Default()
{
return View();
}The Google.Apis.Drive.v3 NuGet package must be installed in your web service project to use the code above.