将大文件上传到 Google Drive 时刷新授权令牌的方法是什么?例如:当前授权令牌的过期时间为“06:00 AM”。文件上传从“05:15 AM”开始。因此,在“06:00 AM”应用程序由于授权令牌无效而获得异常。
我试图用下面的源代码解决这个问题,但它不起作用。
/// <summary>
/// Uploads a file with a specified path.
/// </summary>
/// <param name="startFolder">The start folder.</param>
/// <param name="path">The path of destination file.</param>
/// <param name="localFile">The local file to upload.</param>
/// <returns>The uploaded file.</returns>
private File GdUploadFile(File startFolder, string path, FileInfo localFile)
{
if (startFolder == null)
{
throw new ArgumentNullException("startFolder");
}
if (localFile == null)
{
throw new ArgumentNullException("localFile");
}
if (!localFile.Exists)
{
throw new FileNotFoundException("File not found", localFile.FullName);
}
var config = GetConfiguration();
if (config.TraceLog)
{
Destination.Logger.LogDebug(string.Format("{0} \tUpload file \"{1}\" to \"{2}\"", Destination.Name, localFile.FullName, path));
}
string pathToFile = string.IsNullOrEmpty(path) ? localFile.Name : path;
string remotePath = ExtractFilePath(pathToFile);
var fileFolder = GdCreateFolderByPath(startFolder, remotePath);
var fileName = ExtractFileName(pathToFile);
DriveService service = GetDriveService();
var body = new File
{
Title = fileName,
Description = "My File",
MimeType = BackupFileMimeType,
Kind = DriveFileKindType,
OriginalFilename = fileName,
FileExtension = localFile.Extension,
Parents = new List<ParentReference>
{
new ParentReference
{
ETag = fileFolder.ETag,
Id = fileFolder.Id,
Kind = fileFolder.Kind
}
}
};
FilesResource.InsertMediaUpload request;
var source = new MediaFileSource(localFile.FullName, BackupFileMimeType);
using (var fileStream = source.GetDataStream())
{
if (config.TraceLog)
{
Destination.Logger.LogDebug(string.Format("{0} \tUploading \"{1}\"...", Destination.Name, localFile.FullName));
}
request = service.Files.Insert(body, fileStream, body.MimeType);
if (config.TraceLog)
{
int postedPercent = 0;
request.ProgressChanged += p =>
{
var currentPercent = (int) (p.BytesSent/(double) source.ContentLength*100);
if (currentPercent != postedPercent)
{
string msg = string.Format("{0} \tPosted {1}% ({2} bytes)", Destination.Name,
currentPercent, p.BytesSent);
Destination.Logger.LogDebug(msg);
postedPercent = currentPercent;
}
};
}
var connection = Destination.Connection as GoogleDriveDestinationConnection;
Debug.Assert(connection != null, "connection != null");
request.ProgressChanged += p =>
{
bool refreshAuth = connection.ForceRefreshAuthorization();
var auth =
request.Authenticator as
Google.Apis.Authentication.OAuth2.OAuth2Authenticator<NativeApplicationClient>;
if (auth != null && auth.State != null && refreshAuth)
{
var state = connection.AuthorizationState;
auth.State.AccessToken = state.AccessToken;
auth.State.AccessTokenExpirationUtc = state.AccessTokenExpirationUtc;
auth.State.AccessTokenIssueDateUtc = state.AccessTokenIssueDateUtc;
auth.State.Callback = state.Callback;
auth.State.RefreshToken = state.RefreshToken;
auth.State.SaveChanges();
if (config.TraceLog)
{
Destination.Logger.LogDebug("Authorization state for the upload request is updated");
}
}
};
request.ChunkSize = ChunkSize;
request.Upload();
if (config.TraceLog)
{
Destination.Logger.LogDebug(string.Format("{0} \t\"{1}\" uploaded", Destination.Name, localFile.FullName));
}
}
return request.ResponseBody;
}