I am going through the tutorial provided by Autodesk forge on [RealityCapture API][1].
I would like to develop an app that would send pictures taking by my phone to the the Autodesk forge server and get in return a 3D model.
However I am stuck at the initialization stage of the processing. I have the following error message on my browser window:
At least three images are required to process the Photoscene
And on my Node.js command promt the following error:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (C:\git\recap-walkthrough-photo.to.3d\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\git\recap-walkthrough-photo.to.3d\node_modules\express\lib\response.js:170:12)
at C:\git\recap-walkthrough-photo.to.3d\start.js:171:17
at processTicksAndRejections (internal/process/task_queues.js:95:5) {
code: 'ERR_HTTP_HEADERS_SENT'
}
(node:45332) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (C:\git\recap-walkthrough-photo.to.3d\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\git\recap-walkthrough-photo.to.3d\node_modules\express\lib\response.js:170:12)
at C:\git\recap-walkthrough-photo.to.3d\start.js:176:17
at processTicksAndRejections (internal/process/task_queues.js:95:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:45332) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:45332) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
I only modified the file[] paths and the 'content-type' from the source code:
// Route /api/forge/recap/photoscene/upload
// Adds one or more files to a photoscene.
app.get('/api/forge/recap/photoscene/upload', function (req, res) {
var photosceneId = req.query.photosceneid;
Axios({
method: 'POST',
url: 'https://developer.api.autodesk.com/photo-to-3d/v1/file',
headers: {
'content-type': 'multipart/form-data',
'Authorization': 'Bearer ' + access_token
},
data: querystring.stringify({
photosceneid: photosceneId,
type: 'image',
'file[0]': 'C:\Dataset\FlowerPot\20210527_082430.jpg',
'file[1]': 'C:\Dataset\FlowerPot\20210527_082459.jpg',
'file[2]': 'C:\Dataset\FlowerPot\20210527_082513.jpg',
'file[3]': 'C:\Dataset\FlowerPot\20210527_082525.jpg',
'file[4]': 'C:\Dataset\FlowerPot\20210527_082832.jpg',
'file[5]': 'C:\Dataset\FlowerPot\20210527_082937.jpg',
'file[6]': 'C:\Dataset\FlowerPot\20210527_082944.jpg'
})
})
.then(function (response) {
// Success
console.log(response);
if (response.data.Error) {
res.send(response.data.Error.msg);
}
console.log(JSON.stringify(response.data.Files));
var nextLink = '/api/forge/recap/photoscene/process?photosceneid=' + photosceneId;
res.send('<p>Files added to photoscene!</p><a href="' + nextLink + '">Begin processing photoscene</a>');
})
.catch(function (error) {
// Failed
console.log(error);
res.send('Failed to upload files to photoscene');
});
});
How can I do to verify if my images have been uploaded successfully ?
[1]: https://forge.autodesk.com/developer/learn/recap-app/overview
Note that you cannot use local filesystem paths when uploading files to the ReCap service. You're basically telling the ReCap server "download these 7 files from C:\Dataset\FlowerPot..." but the server obviously cannot access those.
To fix this, you have to either:
const FormData = require('form-data');
// ...
app.get('/api/forge/recap/photoscene/upload', function (req, res) {
// ...
const formData = new FormData();
formData.append('file[0]', someImageBuffer0);
formData.append('file[1]', someImageBuffer1);
formData.append('file[2]', someImageBuffer2);
formData.append('file[3]', someImageBuffer3);
Axios({
method: 'POST',
url: 'https://developer.api.autodesk.com/photo-to-3d/v1/file',
headers: {
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer ' + access_token
},
formData
})
// ...
});
And btw. the Cannot set headers after they are sent to the client
error is issued by the Express.js framework, indicating that somewhere in your code you have already sent a response to a request, and now you're trying to send some additional data to the same response which is not allowed. In this specific case it could be the "success" branch of the file upload where you're potentially sending some error information to the client (res.send(response.data.Error.msg);
) but later on you're sending another message to the same response again (res.send('<p>Files added to photoscene!</p><a href="' + nextLink + '">Begin processing photoscene</a>');
). After sending the error message to the client, consider using the return
statement so that no other data is sent in the response.