使用 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
服务器使用 autodesk forge Forge Node.js SDK. For uploading an object I have used uploadObject() method and multer middleware like what has been said 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()
的对象。
我已经通过 HttpClient
和 MultipartFormDataContent
:
尝试了以下代码
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
响应。
感谢 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");
}
}
}
}
我有一个 node.js
服务器使用 autodesk forge Forge Node.js SDK. For uploading an object I have used uploadObject() method and multer middleware like what has been said 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()
的对象。
我已经通过 HttpClient
和 MultipartFormDataContent
:
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
响应。
感谢 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");
}
}
}
}