使用 C# .NET HTTPClient 在 Node JS 服务器上通过 Multer 将 Revit 文件上传到 Autodesk Forge OSS

Posted

技术标签:

【中文标题】使用 C# .NET HTTPClient 在 Node JS 服务器上通过 Multer 将 Revit 文件上传到 Autodesk Forge OSS【英文标题】:Uploading a Revit file to Autodesk Forge OSS by Multer on a Node JS server with C# .NET HTTPClient 【发布时间】:2020-10-18 14:07:55 【问题描述】:

我有一个使用Forge Node.js SDK 的autodesk forgenode.js 服务器。为了上传一个对象,我使用了uploadObject() 方法和 multer 中间件,就像here 所说的那样。代码是这样的:

router.post(
    '/objects',
    multer( dest: 'uploads/' ).single('fileToUpload'),
    XAuth,
    async (req, res, next) => 
        fs.readFile(req.file.path, async (err, data) => 
            if (err) 
                next(err);
            
            try 
                req.setTimeout(0);

                await new ObjectsApi().uploadObject(
                    req.body.bucketKey,
                    req.file.originalname,
                    data.length,
                    data,
                    ,
                    req.oauth_client,
                    req.oauth_token
                );
                res.status(200).end();
             catch (err) 
                next(err);
            
        );
    
);

就像它在here 中所说的那样,我可以像这样通过Ajax 调用这个api(我使用了input html 元素来获取文件):

var file = input.files[0];
var formData = new FormData();
formData.append('fileToUpload', file);
formData.append('bucketKey', bucketKey.toLowerCase());

$.ajax(
    url: '/api/forge/oss/objects',
    headers: 
       'x-auth': token,
    ,
    type: 'POST',
    data: formData,
    processData: false,
    contentType: false,
    success: function (data) 
        console.log('success: Object has been uploaded');
    ,
    error: function (err) 
        console.log(err);
    ,
);

我通过创建用于上传 Revit 模型的 C# Revit 插件来执行相同的过程。我的意思是如何在 C# 中拥有类似于 FormData() 的对象。 我已经通过HttpClientMultipartFormDataContent 尝试了以下代码:

using (MultipartFormDataContent httpContent = new MultipartFormDataContent())

    Stream file = new FileStream(App.Path, FileMode.Open);
    httpContent.Add(new StringContent(bucketKey.ToLower()), "bucketKey");
    httpContent.Add(new StreamContent(file), "fileToUpload");

    using (var httpClient = new HttpClient  BaseAddress = App.Uri )
    
        httpClient.DefaultRequestHeaders.Add("x-auth", App.Token);

        using (var httpResponse = await httpClient.PostAsync("/api/forge/oss/objects", httpContent))
        
            if (httpResponse.IsSuccessStatusCode)
            
                TaskDialog.Show("Upload", "success: Object has been uploaded"); 
            
        
    

但是我的服务器中出现了MulterError: Field value too long 错误,并且我的 Revit 插件出现了500: 'Internal Server Error 响应。

【问题讨论】:

PUT object to bucket 的端点不接受 multipart/form-data。帮助告诉:forge.autodesk.com/en/docs/data/v2/reference/http/…。带有 LearnForge 示例的 FormData 工作流仅适用于示例本身。 IE。当用户从客户端上传文件时,它将发布存储桶名称以及文件流。在服务器端,ObjectsApi().uploadObject 最终通过放置文件流来实现:github.com/Autodesk-Forge/forge-api-nodejs-client/blob/master/… 在 Forge 的 NET SDK 中,它显示了上传对象的代码。可能会有所帮助。 github.com/Autodesk-Forge/forge-api-dotnet-client/blob/… @XiaodongLiang 非常感谢。考虑到您发送的链接,我想我应该将ContentType 设置为"application/octet-stream" 很高兴知道它有帮助:) 【参考方案1】:

感谢Xiaodong Liang,我像下面这样编辑了我的代码,它对我有用。

using (MultipartFormDataContent httpContent = new MultipartFormDataContent())

    byte[] byteArray = File.ReadAllBytes(App.Path);
    Stream stream = new MemoryStream(byteArray);

    StreamContent streamContent = new StreamContent(stream);
    streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    httpContent.Add(streamContent, "fileToUpload");
    httpContent.Add(new StringContent(bucketKey.ToLower()), "bucketKey");

    using (var httpClient = new HttpClient  BaseAddress = App.Uri )
    
        httpClient.DefaultRequestHeaders.Add("x-auth", App.Token);

        using (var httpResponse = await httpClient.PostAsync("/api/forge/oss/objects", httpContent))
        
            if (httpResponse.IsSuccessStatusCode)
            
                TaskDialog.Show("Upload", "success: Object has been uploaded"); 
            
        
    

【讨论】:

以上是关于使用 C# .NET HTTPClient 在 Node JS 服务器上通过 Multer 将 Revit 文件上传到 Autodesk Forge OSS的主要内容,如果未能解决你的问题,请参考以下文章

.NET 4.5 和 C# 中带有 HttpClient 的 HTTP HEAD 请求

使用 HttpClient C# .NET 获取 URL

如何在 C# (.NET 4.5) 中为 HttpClient.GetAsync(URI) 创建回调?

在 c# (.net core) 中使用 httpclient 时无法建立 SSL 连接,但在 Postman 和 Browser 中有效

C# 9+ 中的 HttpClient 空警告

Atitit.http httpclient实践java c# .net php attilax总结