ASP.NET Dropbox API上传.pdf文件

时间:2016-07-24 13:16:26

标签: c# asp.net pdf encoding dropbox-api

我尝试使用此处提到的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;
        }
    }

我发现它与编码有关,因为上传的文件包含的字符与原始字符不同,但我找不到正确的编码,或者是否有更好的方法?

提前致谢。

1 个答案:

答案 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;
    }
}