Carica foto o file su Google Foto utilizzando l'API di Google Foto, REST e C#.NET

 C Programming >> Programmazione C >  >> Tags >> API
Carica foto o file su Google Foto utilizzando l'API di Google Foto, REST e C#.NET
Buon giorno!

Ho scritto un'applicazione console prima di leggere file da Google Foto utilizzando l'API di Google Foto, REST e C#.NET che legge gli elementi multimediali da Google Foto utilizzando l'API di Google Foto, C# e REST. Quell'applicazione console è stata la base di uno dei miei progetti che utilizzava l'API client del mondo reale. Tuttavia, quel progetto è limitato alla sola lettura dei file e non dispone delle capacità di caricamento. Ora che sono libero con i progetti al lavoro, è il momento di rivisitare l'API di Google Foto e creare una semplice applicazione console che caricherà foto/immagini o file su Google Foto utilizzando REST, l'API di Google Foto e C#.
Quindi, per iniziare, assicurati di aver letto la documentazione per configurare l'API qui Inizia con REST. Dopo aver configurato correttamente l'API, scarica il file JSON che contiene le tue credenziali in particolare Client Secret e ID cliente e aggiungi quel file al tuo progetto di app console. Assicurati di impostare Copia nella directory di output del file JSON su Copia sempre in Esplora soluzioni di Visual Studio. Aggiungi anche questi pacchetti Nuget Google.Apis , Google.Apis.Auth e Google.Apis.Core poiché verranno utilizzati per autenticare la tua applicazione console quando accedi al cloud di Google Foto.
Il metodo principale dell'app console ottiene i file da caricare da una directory esistente, imposta l'ambito dell'applicazione per creare elementi multimediali e caricarli in byte che è appendonly ed esegue l'autorizzazione e l'autenticazione della tua applicazione. Quindi chiamerà il metodo di caricamento dei file che passerà la directory, l'oggetto UserCredential e i file recuperati.
static void Main(string[] args)
{
	string UserName = "[email protected]";
	string credPath = @"D:\Codes\GooglePhotosUpload\";
	string filesRepository = @"D:\FilesToUploadFolder";
	string[] files = Directory.GetFiles(filesRepository);
    UserCredential credential;
	string[] scopes = {
		"https://www.googleapis.com/auth/photoslibrary.appendonly"
	 };

	

	using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
	{
		credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
			GoogleClientSecrets.Load(stream).Secrets,
			scopes,
			UserName,
			CancellationToken.None,
			new FileDataStore(credPath, true)).Result;
	}

	try
	{          
		if (files.Length > 0)
		{
			UploadFileWebRequest(filesRepository, credential, files);
		}
	}
	catch (Exception ex)
	{
		Console.WriteLine("Error occured: " + ex.Message);
	}

	Console.WriteLine("Files Uploaded Successfully!!!");
	Console.ReadLine();
}
Il metodo di caricamento dei file scorre i file e crea un oggetto attività per ogni singolo file che a sua volta invierà una richiesta POST all'API insieme alle intestazioni della richiesta POST definite in questa documentazione Upload Media. Se la pubblicazione di un file ha esito positivo, restituirà un token di caricamento per quel file che verrà utilizzato per creare quell'elemento multimediale nel cloud. Ho aggiunto il token di caricamento insieme al nome del file a un dizionario che verrà utilizzato per creare gli elementi multimediali. Successivamente è creare la stringa JSON che contiene gli elementi multimediali da inviare al cloud che segue il formato definito nella documentazione sopra . Viene creato un oggetto di richiesta separato che include l'URL e le intestazioni corrette che caricheranno gli elementi multimediali nel cloud.
private static void UploadFileWebRequest(string filesRepository, UserCredential credential, string[] fileNames)
{
	string jsonData = string.Empty;
	List<Task> tasks = new List<Task>();
	Dictionary<string, string> fileUploads = new Dictionary<string, string>();

	//Get upload-token 
	foreach (var fileName in fileNames)
	{
		var task = new Task(() =>
		{
			byte[] byteArr = File.ReadAllBytes(Path.Combine(filesRepository, Path.GetFileName(fileName)));

			var request = WebRequest.Create("https://photoslibrary.googleapis.com/v1/uploads");
			request.Method = "POST";
			request.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);
			request.Headers.Add("X-Goog-Upload-Content-Type", "raw");
			request.Headers.Add("X-Goog-Upload-Content-Type", "image/jpeg");
			request.Headers.Add("X-Goog-Upload-File-Name", Path.GetFileName(fileName));
			request.ContentType = "application/octet-stream";
			request.ContentLength = byteArr.Length;
			request.Credentials = CredentialCache.DefaultCredentials;

			Stream dataStream = request.GetRequestStream();
			dataStream.Write(byteArr, 0, byteArr.Length);
			dataStream.Close();

			WebResponse response = request.GetResponse();
			using (dataStream = response.GetResponseStream())
			{
				StreamReader reader = new StreamReader(dataStream);
				string uploadToken = reader.ReadToEnd();
				fileUploads.Add(Path.GetFileName(fileName), uploadToken);
			}

			response.Close();
		});

		tasks.Add(task);
		task.Start();
	}

	Task.WaitAll(tasks.ToArray());

	//Prepare to create media items
	jsonData = "{";
	jsonData += "\"newMediaItems\": [";
	foreach (var fileUpload in fileUploads)
	{
		jsonData += "{";
		jsonData += "\"description\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
		jsonData += "\"simpleMediaItem\": {";
		jsonData += "\"fileName\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
		jsonData += "\"uploadToken\": \"" + fileUpload.Value + "\"";
		jsonData += "}";
		jsonData += "},";
	}
	jsonData += "]";
	jsonData += "}";
	jsonData = jsonData.Remove(jsonData.Length - 3, 1);

	var requestUpload = WebRequest.Create("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate");
	requestUpload.ContentType = "application/json";
	requestUpload.Method = "POST";
	requestUpload.Credentials = CredentialCache.DefaultCredentials;
	requestUpload.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);

	using (var streamWriter = new StreamWriter(requestUpload.GetRequestStream()))
	{
		streamWriter.Write(jsonData.ToString());
	}

	try
	{
		var httpResponse = (HttpWebResponse)requestUpload.GetResponse();
		using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
		{
			var result = streamReader.ReadToEnd();
		}
	}
	catch (WebException ex)
	{
		using (WebResponse responseError = ex.Response)
		{
			var httpResponse = (HttpWebResponse)responseError;

			using (Stream data = responseError.GetResponseStream())
			{
				StreamReader sr = new StreamReader(data);
				Console.WriteLine(sr.ReadToEnd());
			}
		}
	}
}
Una volta che tutto è impostato correttamente e i codici non presentano errori durante la modalità di debug, si aprirà un browser Internet Explorer o Microsoft Edge chiedendoti di accedere a Google Foto utilizzando il tuo account e autorizzando la tua app a caricare gli elementi multimediali. Quindi scaricherà un codice di verifica sulla tua app. Per verificare se il caricamento degli elementi multimediali o se i file sono stati caricati correttamente, vai su Google Foto e accedi utilizzando il tuo account gmail. Dovresti essere in grado di vedere i tuoi file salvati nel cloud di foto. Ecco il codice sorgente completo dell'app console.
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;

namespace GooglePhotosUpload
{
    class Program
    {
        static void Main(string[] args)
        {
            string UserName = "[email protected]";
            string credPath = @"D:\Codes\GooglePhotosUpload\";
            string filesRepository = @"D:\FilesToUploadFolder";
            string[] files = Directory.GetFiles(filesRepository);

            UserCredential credential;
            string[] scopes = {
                "https://www.googleapis.com/auth/photoslibrary.appendonly"
             };

            
            using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    scopes,
                    UserName,
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
            }

            try
            {          
                if (files.Length > 0)
                {
                    UploadFileWebRequest(filesRepository, credential, files);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error occured: " + ex.Message);
            }

            Console.WriteLine("Files Uploaded Successfully!!!");
            Console.ReadLine();
        }

        private static void UploadFileWebRequest(string filesRepository, UserCredential credential, string[] fileNames)
        {
            string jsonData = string.Empty;
            List<Task> tasks = new List<Task>();
            Dictionary<string, string> fileUploads = new Dictionary<string, string>();

            //Get upload-token 
            foreach (var fileName in fileNames)
            {
                var task = new Task(() =>
                {
                    byte[] byteArr = File.ReadAllBytes(Path.Combine(filesRepository, Path.GetFileName(fileName)));

                    var request = WebRequest.Create("https://photoslibrary.googleapis.com/v1/uploads");
                    request.Method = "POST";
                    request.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);
                    request.Headers.Add("X-Goog-Upload-Content-Type", "raw");
                    request.Headers.Add("X-Goog-Upload-Content-Type", "image/jpeg");
                    request.Headers.Add("X-Goog-Upload-File-Name", Path.GetFileName(fileName));
                    request.ContentType = "application/octet-stream";
                    request.ContentLength = byteArr.Length;
                    request.Credentials = CredentialCache.DefaultCredentials;

                    Stream dataStream = request.GetRequestStream();
                    dataStream.Write(byteArr, 0, byteArr.Length);
                    dataStream.Close();

                    WebResponse response = request.GetResponse();
                    using (dataStream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(dataStream);
                        string uploadToken = reader.ReadToEnd();
                        fileUploads.Add(Path.GetFileName(fileName), uploadToken);
                    }

                    response.Close();
                });

                tasks.Add(task);
                task.Start();
            }

            Task.WaitAll(tasks.ToArray());

            //Prepare to create media items
            jsonData = "{";
            jsonData += "\"newMediaItems\": [";
            foreach (var fileUpload in fileUploads)
            {
                jsonData += "{";
                jsonData += "\"description\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
                jsonData += "\"simpleMediaItem\": {";
                jsonData += "\"fileName\": \"" + Path.GetFileName(fileUpload.Key) + "\"" + ",";
                jsonData += "\"uploadToken\": \"" + fileUpload.Value + "\"";
                jsonData += "}";
                jsonData += "},";
            }
            jsonData += "]";
            jsonData += "}";
            jsonData = jsonData.Remove(jsonData.Length - 3, 1);

            var requestUpload = WebRequest.Create("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate");
            requestUpload.ContentType = "application/json";
            requestUpload.Method = "POST";
            requestUpload.Credentials = CredentialCache.DefaultCredentials;
            requestUpload.Headers.Add("Authorization:" + credential.Token.TokenType + " " + credential.Token.AccessToken);

            using (var streamWriter = new StreamWriter(requestUpload.GetRequestStream()))
            {
                streamWriter.Write(jsonData.ToString());
            }

            try
            {
                var httpResponse = (HttpWebResponse)requestUpload.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                using (WebResponse responseError = ex.Response)
                {
                    var httpResponse = (HttpWebResponse)responseError;

                    using (Stream data = responseError.GetResponseStream())
                    {
                        StreamReader sr = new StreamReader(data);
                        Console.WriteLine(sr.ReadToEnd());
                    }
                }
            }
        }
    }
}