API Google Диска с использованием С# - Загрузка
Я пытаюсь использовать Google Drive API из приложения asp.net для загрузки файлов.
Проблема: код работает локально, но при загрузке на сервер ничего не происходит (страница просто продолжает загружаться... экран разрешения не отображается. Помощь устранена.
Папка "UploadedPdf" доступна для записи, а client_secrets.json существует в папке.
ПРИМЕЧАНИЕ. Я ничего не установил на сервере, а просто загрузил все файлы, включая DLL API Google, в папку bin на сервере.
UserCredential credential;
using (var filestream = new FileStream(Server.MapPath("UploadedPdf/client_secrets.json"),
FileMode.Open, FileAccess.Read))
{
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(filestream).Secrets,
new[] { DriveService.Scope.Drive },
"user",
CancellationToken.None,
new FileDataStore(Server.MapPath("UploadedPdf/"))).Result;
}
// Create the service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Drive API Sample",
});
Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File();
body.Title = "My document";
body.Description = "A test document";
body.MimeType = "text/plain";
byte[] byteArray = System.IO.File.ReadAllBytes(Server.MapPath("UploadedPdf/sample.txt"));
System.IO.MemoryStream stream = new System.IO.MemoryStream(byteArray);
FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, "text/plain");
request.Upload();
Google.Apis.Drive.v2.Data.File file = request.ResponseBody;
Ответы
Ответ 1
FileDatastore помещает файлы по умолчанию в% appData%. Обычно я бы сделал что-то вроде этого. (позволяет предположить, что я также использую "пользователь" )
new FileDataStore("Console.Analytics.Auth.Store")
Затем, когда я его вызываю, я получаю каталог с именем
%AppData%\Roaming\Console.Analytics.Auth.Store
в этом каталоге теперь находится файл с именем
Google.Apis.Auth.OAuth2.Responses.TokenResponse-user
Я не тестировал, что делать
new FileDataStore(Server.MapPath("UploadedPdf/"))
но я предполагаю, что вы собираетесь получить каталог с именем
%AppData%\Roaming\serverpat/uploadpdf/
Что я не думаю, это то, что вам нужно. Если это на самом деле то, что вы пытаетесь сделать, вы сделали этот каталог доступным для записи? Возможно, вы захотите посмотреть вместо LocalFileDataStore.
Я не уверен, что это ваша проблема или нет.
Также помните, что вы жестко кодируете "пользователь", поэтому технически ваш код попросит вас пройти аутентификацию один раз для "пользователя", после чего у него есть аутентификация в этом файле для "пользователя", поэтому нет причин просить об этом еще раз.
Ответ 2
Я думаю, что вы вызываете AuthorizeAsync() неправильно. Используйте ключевое слово ожидания и удалите .Result. Для этого вам нужно будет пометить метод как асинхронный.
Я бы также предложил использовать метод UploadAsync(). Вам не нужно загружать весь файл в память с помощью ReadAllBytes(). Просто используйте File.OpenRead() и передайте FileStream вместо MemoryStream.
В Google есть пример кода:
https://developers.google.com/api-client-library/dotnet/guide/media_upload
Ответ 3
Ваш код подсказывает, что вы используете рабочий процесс/учетные данные "Установленный приложение", который должен работать нормально, если вы используете приложение ASP.NET локально. Однако, когда вы перемещаете один и тот же код на веб-сервер, его больше не установлено. Он входит в категорию "Веб-приложение".
Вам нужно перейти в Консоль разработчика Google → Учетные данные- > Создать новый идентификатор клиента и создать новый набор учетных данных для вашего веб-приложения. Также вам необходимо изменить поток OAuth в соответствии с этим руководством:
https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc
Ответ 4
Шаги включают
1)Access to the internet and a web browser, in order to authorize the sample app.
2)A Google account with Drive enabled.
3)An environment to run programs in your selected language.
попробуйте это,
https://developers.google.com/drive/v2/reference/files/insert#examples