0

在我创建了一个场景之后,我正在尝试将我的文件作为表单数据上传。但我总是收到错误“数据库中不存在指定的 Photoscene ID”(之前直接创建)。

我的上传功能:

// Upload Files
async function uploadFiles(access_Token, photoSceneId, files) {
    try {

        const params = new URLSearchParams({
            'photosceneid': photoSceneId,
            'type': 'image',
            'file': files
        })

        const headers = Object.assign({
            Authorization: 'Bearer ' + access_Token,
            'Content-Type': 'multipart/form-data' }, 
            files.getHeaders()
        )
        
        let resp = await axios({
            method: 'POST',
            url: 'https://developer.api.autodesk.com/photo-to-3d/v1/file',
            headers: headers,
            data: params

        })
        let data = resp.data;
        return data;
    } catch (e) {
        console.log(e);
    }
};

我也尝试了一些变种,例如将photosceneId 添加到表单数据(form.append(..),但也不起作用。

任何有用的建议表示赞赏。提前谢谢。

4

2 回答 2

0

这里可能有两个问题。首先,我不确定,因为我没有将 URLSearchParams 作为 POST 请求的“打包程序”的经验。这可能是您收到“数据库中不存在指定的照片场景 ID”错误的原因 - 可能是使用 URLSearchParams 序列化数据的方式不兼容。

我敢肯定,第二个问题与您提交文件的方式有关。根据文档,您必须一一传递文件,例如

  "file[0]=http://www.autodesk.com/_MG_9026.jpg" \
  "file[1]=http://www.autodesk.com/_MG_9027.jpg"

而不仅仅是将数组传递给“文件”字段。

话虽如此,请尝试以下方法:

var axios = require('axios');
var FormData = require('form-data');
var fs = require('fs');
var data = new FormData();
var TOKEN = 'some TOKEN';
const photoSceneID = 'some_photoscene_id';

data.append('photosceneid', photoSceneID);
data.append('type', 'image');
data.append('file[0]', fs.createReadStream('/C:/TEMP/Example/DSC_5427.JPG'));
data.append('file[1]', fs.createReadStream('/C:/TEMP/Example/DSC_5428.JPG'));
data.append('file[2]', fs.createReadStream('... and so on ...'));

var config = {
  method: 'post',
  url: 'https://developer.api.autodesk.com/photo-to-3d/v1/file',
  headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Authorization': 'Bearer ' + TOKEN, 
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

此外,我始终建议不要直接跳入代码,而是先使用PostmanInsomnia等应用程序检查工作流程,然后在验证工作流程(创建照片场景、所有图像已正确上传等)后,您可以翻译这进入代码。

这篇博文的末尾,您会找到指向已经创建的 Postman 收藏的链接,但我强烈建议您构建自己的收藏,作为学习步骤的一部分。

于 2021-12-23T15:15:01.523 回答
0

这是对我有用的解决方案。请注意,每次调用最多只能上传 20 个文件。

// Upload Files
async function uploadFiles(access_Token, photoSceneId) {
    try {

        let dataPath = path.join(__dirname, '../../data')
        let files = fs.readdirSync(dataPath)
    
        var data = new FormData();

        data.append('photosceneid', photoSceneId)
        data.append('type', 'image')

        for(let i=0; i < files.length; i++) {

            let filePath = path.join(dataPath, files[i])
            let fileName = 'file[' + i + ']'

            data.append(fileName, fs.createReadStream(filePath))
            
        }

        const headers = Object.assign({
            Authorization: 'Bearer ' + access_Token,
            'Content-Type': 'multipart/form-data;boundary=' + data.getBoundary()}, 
            data.getHeaders()
        )
        
        let resp = await axios({
            method: 'POST',
            url: 'https://developer.api.autodesk.com/photo-to-3d/v1/file',
            headers: headers,
            maxContentLength: Infinity,
            maxBodyLength: Infinity,
            data: data

        })
        let dataResp = resp.data;
        return dataResp;
    } catch (e) {
        console.log(e);
    }
};

于 2022-01-04T16:03:17.607 回答