簡體   English   中英

使用 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

我有一個node.js服務器,使用Forge 的 Autodesk forge Node.js SDK 為了上傳 object,我使用了 uploadObject()方法和multer中間件,就像這里所說的那樣。 代碼是這樣的:

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

就像這里所說的那樣,我可以像這樣用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);
    },
});

我通過創建 C# Revit 插件來上傳 Revit model 來執行相同的過程。 我的意思是我如何才能擁有類似於 C# 中的FormData()的 object。 我已經通過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錯誤和500: 'Internal Server Error response to my Revit plugin。

感謝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"); 
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM