将相同的文档上传到 Dropbox .NET SDK
Upload same documents to Dropbox .NET SDK
我有一个网络 API 功能可以成功将文件上传到 Dropbox(使用他们新的 .NET SDK),然后获取上传文件的共享链接(每个文档一次)。
private async Task<string> Upload(DropboxClient dbx, string localPath, string remotePath)
{
const int ChunkSize = 4096 * 1024;
using (var fileStream = File.Open(localPath, FileMode.Open))
{
if (fileStream.Length <= ChunkSize)
{
WriteMode mode = new WriteMode();
FileMetadata fileMetadata = await dbx.Files.UploadAsync(remotePath, body: fileStream, mode: mode.AsAdd, autorename: true);
//set the expiry date
var settings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(fileMetadata.PathLower, settings);
return sharedLinkMetadata.Url;
}
else
{
await this.ChunkUpload(dbx, remotePath, fileStream, ChunkSize);
}
return "error";
}
}
这通常可以正常工作,但是当我两次上传完全相同的文档(名称和内容)时,没有任何反应,我确实需要将这两个文件都存储在我的 Dropbox 帐户中。
可以根据需要使用尽可能多的相同文档(不仅仅是两个),我最好的方案是让第二个文档(和第三个等等)自动重命名并上传到 Dropbox。
知道如何实现吗?
当您再次将完全相同的内容上传到同一路径时,Dropbox API 不会产生冲突或文件的另一个副本,因为没有任何变化。 (编辑:您可以使用 strictConflict=true
,例如在 UploadAsync
上强制冲突,即使是相同的内容)。
如果您想要帐户中相同数据的另一个副本,您可以在第二次调用 UploadAsync
时指定不同的所需路径。
或者,更高效的方法是,您可以使用 CopyAsync
复制 Dropbox 上已有的文件。
我post答案,也许它会对某人有所帮助..我花了很长时间才弄明白。
这是检查文件是否已存在于 Dropbox 中的代码。
如果文件存在,它会检查 link 是否已为此文件共享,并根据结果 generates/retrieves a/the 共享 link.
private async Task<string> Upload(DropboxClient dbx, string localPath, string remotePath)
{
const int ChunkSize = 4096 * 1024;
using (var fileStream = File.Open(localPath, FileMode.Open))
{
if (fileStream.Length <= ChunkSize)
{
WriteMode mode = new WriteMode();
FileMetadata fileMetadata = await dbx.Files.UploadAsync(remotePath, body: fileStream, mode: mode.AsAdd, autorename: true);
//set the expiry date
var existingDoc = await dbx.Files.GetMetadataAsync(remotePath);
if (existingDoc.IsFile)
{
var sharedLink = await dbx.Sharing.ListSharedLinksAsync(remotePath);
var settings = new ListSharedLinksArg(remotePath);
ListSharedLinksResult listSharedLinksResult = await dbx.Sharing.ListSharedLinksAsync(remotePath);
if (listSharedLinksResult.Links.Count > 0)
{
return listSharedLinksResult.Links[0].Url;
}
else
{
var sharedLinkSettings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(remotePath, sharedLinkSettings);
return sharedLinkMetadata.Url;
}
}
else
{
var settings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(fileMetadata.PathLower, settings);
return sharedLinkMetadata.Url;
}
}
else
{
var sharedLink = await this.ChunkUpload(dbx, remotePath, fileStream, ChunkSize);
return sharedLink;
}
}
我有一个网络 API 功能可以成功将文件上传到 Dropbox(使用他们新的 .NET SDK),然后获取上传文件的共享链接(每个文档一次)。
private async Task<string> Upload(DropboxClient dbx, string localPath, string remotePath)
{
const int ChunkSize = 4096 * 1024;
using (var fileStream = File.Open(localPath, FileMode.Open))
{
if (fileStream.Length <= ChunkSize)
{
WriteMode mode = new WriteMode();
FileMetadata fileMetadata = await dbx.Files.UploadAsync(remotePath, body: fileStream, mode: mode.AsAdd, autorename: true);
//set the expiry date
var settings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(fileMetadata.PathLower, settings);
return sharedLinkMetadata.Url;
}
else
{
await this.ChunkUpload(dbx, remotePath, fileStream, ChunkSize);
}
return "error";
}
}
这通常可以正常工作,但是当我两次上传完全相同的文档(名称和内容)时,没有任何反应,我确实需要将这两个文件都存储在我的 Dropbox 帐户中。
可以根据需要使用尽可能多的相同文档(不仅仅是两个),我最好的方案是让第二个文档(和第三个等等)自动重命名并上传到 Dropbox。
知道如何实现吗?
当您再次将完全相同的内容上传到同一路径时,Dropbox API 不会产生冲突或文件的另一个副本,因为没有任何变化。 (编辑:您可以使用 strictConflict=true
,例如在 UploadAsync
上强制冲突,即使是相同的内容)。
如果您想要帐户中相同数据的另一个副本,您可以在第二次调用 UploadAsync
时指定不同的所需路径。
或者,更高效的方法是,您可以使用 CopyAsync
复制 Dropbox 上已有的文件。
我post答案,也许它会对某人有所帮助..我花了很长时间才弄明白。
这是检查文件是否已存在于 Dropbox 中的代码。
如果文件存在,它会检查 link 是否已为此文件共享,并根据结果 generates/retrieves a/the 共享 link.
private async Task<string> Upload(DropboxClient dbx, string localPath, string remotePath)
{
const int ChunkSize = 4096 * 1024;
using (var fileStream = File.Open(localPath, FileMode.Open))
{
if (fileStream.Length <= ChunkSize)
{
WriteMode mode = new WriteMode();
FileMetadata fileMetadata = await dbx.Files.UploadAsync(remotePath, body: fileStream, mode: mode.AsAdd, autorename: true);
//set the expiry date
var existingDoc = await dbx.Files.GetMetadataAsync(remotePath);
if (existingDoc.IsFile)
{
var sharedLink = await dbx.Sharing.ListSharedLinksAsync(remotePath);
var settings = new ListSharedLinksArg(remotePath);
ListSharedLinksResult listSharedLinksResult = await dbx.Sharing.ListSharedLinksAsync(remotePath);
if (listSharedLinksResult.Links.Count > 0)
{
return listSharedLinksResult.Links[0].Url;
}
else
{
var sharedLinkSettings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(remotePath, sharedLinkSettings);
return sharedLinkMetadata.Url;
}
}
else
{
var settings = new SharedLinkSettings(expires: DateTime.Today.AddDays(7));
SharedLinkMetadata sharedLinkMetadata = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(fileMetadata.PathLower, settings);
return sharedLinkMetadata.Url;
}
}
else
{
var sharedLink = await this.ChunkUpload(dbx, remotePath, fileStream, ChunkSize);
return sharedLink;
}
}