Save Documents to Google Drive in ASP.NET MVC 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
Set up a project in the Google Developers Console and enable the Google Drive API. Then obtain the necessary credentials to access the API. For more information, see the official link.
Step 2: Create a Simple DOCX Editor Sample in ASP.NET MVC
Follow the steps in this link to create a simple DOCX Editor sample in ASP.NET MVC. This gives 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 constructor parameters to the
DocumentEditorControllerclass. In the constructor, assign the values from the configuration to the corresponding fields.
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 uploaded document to a Google Drive folder.
[AcceptVerbs("Post")]
[HttpPost]
[EnableCors("AllowAllOrigins")]
[Route("SaveToGoogleDrive")]
// Post action for uploading 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);
FilesResource.CreateMediaUpload request;
request = service.Files.Create(fileMetadata, stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
request.Fields = "id";
object value = await request.UploadAsync();
}
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, and 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, respectively.
The FolderId part 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.
You must use a unique
Client_IDfrom the JSON file to interface your application with the Google Drive API in order to save a document directly to Google Drive. ThisClient_IDserves as the authentication key, allowing you to save files securely.
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 to save it in Google Drive.
@Html.EJS().Button("export").Content("Save to Google Drive").Render()
@Html.EJS().DocumentEditorContainer("container").EnableToolbar(true).Render()
<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 application to use the previous code example.