【问题标题】:ASP.NET Dropbox API uploading .pdf filesASP.NET Dropbox API 上传 .pdf 文件
【发布时间】:2016-07-24 22:17:07
【问题描述】:

我尝试使用此处提到的 API 的 UploadAsync() 上传 pdf 文件: https://www.dropbox.com/developers/documentation/dotnet#tutorial

文件已上传,但已损坏且无法打开,我使用

读取了 pdf 文件的内容
System.IO.File.ReadAllText(fileUri);

然后通过等待此函数上传文件,该函数返回指向保管箱上文件的可共享链接:

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

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    System.IO.File.ReadAllText(fileUri) 读取文件的字节并将它们转换为字符串。然后使用Encoding.UTF8 写回字符串可能会更改内容。

    请跳过此转换并直接使用字节。例如

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

    【讨论】:

    • 我们使用了另一种方法来完成任务,不过感谢您的回答,不过我没有测试它。
    • 感谢您分享您的解决方案并为社区提供帮助
    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多