首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#和Flurl多部分发布到Joplin

使用C#和Flurl多部分发布到Joplin
EN

Stack Overflow用户
提问于 2020-05-02 14:43:23
回答 1查看 411关注 0票数 1

我目前正在开发一个控制台应用程序,使用C#和Flurl将数据导入到10中。Joplin的API描述可以找到这里

我正试图在Joplin中为我的系统上的一个文件创建一个新的资源,这样就可以将它附加到Joplin便笺上。

使用CURL,我可以使用命令创建资源:

代码语言:javascript
复制
curl -F  "data=@c:\\temp\\Test.pptx" -F  "props={\"title\":\"my resource title\"}" http://localhost:41184/resources?token=MyToken

(注:它只适用于"data=@c:\temp\Test.pptx",而不适用于"data=c:\temp\Test.pptx")

当我在c#中尝试使用Flurl时,我从Joplin那里得到了400个响应,在日志中我发现:

错误:在没有文件的情况下不能创建资源( C:\ ProgramFiles\Joplin\resources\app.asar\lib\services\rest\Api.js:351:37) at Files\Joplin\resources\app.asar\lib\services\rest\Api.js:351:37) at Api.route )(C:\ProgramApi.action_resources at execRequest )(C:\ProgramFiles\Joplin\resources\app.asar\lib\ClipperServer.js:157:39)在C:\程序Files\Joplin\resources\app.asar\lib\ClipperServer.js:185:8 at C:\Program Files\Joplin\resources\app.asar\node_modules\multiparty\index.js:136:9 at C:\ProgramFiles\Joplin\resources\app.asar\node_modules\multiparty\index.js:115:9 at processTicksAndRejections (内部/process/task_Quees.js:75:11)“

到目前为止,我已经尝试过了:

代码语言:javascript
复制
        try
        {
            var url = BaseUrl
                .WithHeader("User_Agent", browserUserAgent)
                .AppendPathSegment("resources")
                .SetQueryParam("token", Token);

            using (var fs = new FileStream("c:\\temp\\Test.pptx", FileMode.Open, FileAccess.Read))
            {
                var resource = url.PostMultipartAsync(mp => mp
                        .AddJson("props", new { title = "test title" })
                        .AddFile("data", fs, "Test.pptx", "application/octet-stream")
                        )
                    .ReceiveJson<JoplinResource>()
                    .Result;
            }
        }

以及:

代码语言:javascript
复制
        try
        {
            var url = BaseUrl
                .WithHeader("User_Agent", browserUserAgent)
                .AppendPathSegment("resources")
                .SetQueryParam("token", Token);

            var resource = url.PostMultipartAsync(mp => mp
                    .AddJson("props", new { title = "test title" })
                    .AddFile("data", "c:\\temp\\Test.pptx")
                    )
                .ReceiveJson<JoplinResource>()
                .Result;
        }

我找了个小提琴手,看看我的应用程序和卷发有什么区别。

卷曲:

代码语言:javascript
复制
POST http://127.0.0.1:41184/resources?token=MyToken HTTP/1.1
Host: 127.0.0.1:41184
User-Agent: curl/7.70.0
Accept: */*
Connection: Keep-Alive
Content-Length: 33648
Content-Type: multipart/form-data; boundary=------------------------91ab181cbb0247ba

--------------------------91ab181cbb0247ba
Content-Disposition: form-data; name="props"

{"title":"my resource title"}
--------------------------91ab181cbb0247ba
Content-Disposition: form-data; name="data"; filename="Test.pptx"
Content-Type: application/octet-stream
...

我的控制台应用程序:

代码语言:javascript
复制
POST http://localhost:41184/resources?token=MyToken HTTP/1.1
User_Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Content-Type: multipart/form-data; boundary="f603841b-5c32-4e77-985a-69c2ffb6eed0"
Host: localhost:41184
Content-Length: 33612
Expect: 100-continue
Accept-Encoding: gzip, deflate

--f603841b-5c32-4e77-985a-69c2ffb6eed0
Content-Disposition: form-data; name=props

{"title":"My Resource"}
--f603841b-5c32-4e77-985a-69c2ffb6eed0
Content-Disposition: form-data; name=data; filename=Test.pptx; filename*=utf-8''Test.pptx
...

注意不同之处:

  1. 当使用CURL时,道具和数据都是引号,而不是FLURL。
  2. FLURL发送第二个文件名:filename*=utf-8''Test.pptx

我怎样才能让它正常工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-04 15:23:27

问题在于“数据”和“道具”缺少引号:

代码语言:javascript
复制
    try
    {
        var url = BaseUrl
            .WithHeader("User_Agent", browserUserAgent)
            .AppendPathSegment("resources")
            .SetQueryParam("token", Token);

            var resource = url.PostMultipartAsync(mp => mp
                    .AddJson("\"props\"", new { title = "My Resource" })
                    .AddFile("\"data\"", "c:\\temp\\Test.pptx")
                    )
                .ReceiveJson<JoplinResource>()
                .Result;
    }

原始请求头现在是:

代码语言:javascript
复制
POST http://localhost:41184/resources?token=MyToken HTTP/1.1
User_Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Content-Type: multipart/form-data; boundary="c6b2377a-1240-4ae3-872f-fa24b643d3e0"
Host: localhost:41184
Content-Length: 33616
Expect: 100-continue
Accept-Encoding: gzip, deflate

--c6b2377a-1240-4ae3-872f-fa24b643d3e0
Content-Disposition: form-data; name="props"

{"title":"My Resource"}
--c6b2377a-1240-4ae3-872f-fa24b643d3e0
Content-Disposition: form-data; name="data"; filename=Test.pptx; filename*=utf-8''Test.pptx
...

Joplin REST服务创建了一个新的资源..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61561179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档