我尝试使用此处提到的API的UploadAsync()上传pdf文件: https://www.dropbox.com/developers/documentation/dotnet#tutorial
文件上传但是文件已损坏且无法打开,我使用
读取了pdf文件的内容System.IO.File.ReadAllText(fileUri);
然后通过等待此函数上传文件,该函数返回dropbox上文件的可共享链接:
public static async Task<string> UploadFile(string folder, string fileName, string content)
{
using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content)))
{
FileMetadata updated = await dbx.Files.UploadAsync(
folder + "/" + fileName,
WriteMode.Overwrite.Instance,
body: mem);
var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName);
var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1);
return share.Url;
}
}
我发现它与编码有关,因为上传的文件包含的字符与原始字符不同,但我找不到正确的编码,或者是否有更好的方法?
提前致谢。
答案 0 :(得分:2)
System.IO.File.ReadAllText(fileUri)
读取文件的字节并将其转换为字符串。然后使用Encoding.UTF8
写回字符串可能会更改内容。
请跳过此转换并直接使用字节。 E.g。
var content = System.IO.File.ReadAllBytes(fileUri);
并将功能从string content
更改为byte[] content
。
public static async Task<string> UploadFile(string folder, string fileName, byte[] content)
{
using (var mem = new MemoryStream(content))
{
FileMetadata updated = await dbx.Files.UploadAsync(
folder + "/" + fileName,
WriteMode.Overwrite.Instance,
body: mem);
var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName);
var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1);
return share.Url;
}
}
此解决方案仍将整个文件内容复制到内存中。直接从文件中读取内存消耗效率更高。
public static async Task<string> UploadFile(string folder, string fileName, string fileUri)
{
using (var mem = new FileStream(fileUri, FileMode.Open, FileAccess.Read))
{
FileMetadata updated = await dbx.Files.UploadAsync(
folder + "/" + fileName,
WriteMode.Overwrite.Instance,
body: mem);
var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName);
var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1);
return share.Url;
}
}