问题
I am now able to upload a file and create an initial version for the file but am unable to update the version. Using the code in Step 6 of this tutorial does not work even after replacing versions:autodesk.core:File
with versions:autodesk.bim360:File
. From the error message, Request contains 0 includes instead of 1
, it seems I need part of the included
block from the example in Step 5 but I am not sure what it should look like; given the outer relationships
blocks do not match in format between Steps 5 and 6, I am assuming the inner content varies as well.
def create_version_for_file(self, project_name, file_name, folder_id, object_id, storage_id):
project_id = self.get_project_id_by_name(project_name)
existing_object_id = self.get_version_id_for_file_in_folder(project_name, folder_id, file_name)
url = '{}data/v1/projects/{}/items'.format(self.DOMAIN, project_id)
logger.info('Starting version create at %s for file_name %s, folder %s, object %s',
url, file_name, folder_id, object_id)
if existing_object_id:
logger.info('Creating version for existing object')
data = self._get_version_data_for_existing_file(file_name, object_id, storage_id)
else:
logger.info('Creating version for new object')
data = self._get_version_json_for_new_file(file_name, folder_id, object_id)
response = self.session.post(url, json=data, headers={
'content-type': 'application/vnd.api+json',
'accept': 'application/vnd.api+json'
})
if response.status_code != status.HTTP_201_CREATED:
logger.warn('Version create for %s failed with status %s: %s', file_name, response.status_code,
response.content)
return None
return json.loads(response.content)
def _get_version_json_for_new_file(self, file_name, folder_id, object_id):
return {
"jsonapi": {"version": "1.0"},
"data": {
"type": "items",
"attributes": {
"displayName": file_name,
"extension": {
"type": "items:autodesk.bim360:File",
"version": "1.0"
}
},
"relationships": {
"tip": {
"data": {
"type": "versions",
"id": "1"
}
},
"parent": {
"data": {
"type": "folders",
"id": folder_id
}
}
}
},
"included": [
{
"type": "versions",
"id": "1",
"attributes": {
"name": file_name,
"extension": {
"type": "versions:autodesk.bim360:File",
"version": "1.0"
}
},
"relationships": {
"storage": {
"data": {
"type": "objects",
"id": object_id
}
}
}
}
]
}
def _get_version_data_for_existing_file(self, file_name, object_id, storage_id):
return {
"jsonapi": {
"version": "1.0"
},
"data": {
"type": "versions",
"attributes": {
"name": file_name,
"extension": {
"type": "versions:autodesk.bim360:File",
"version": "1.0"
}
},
"relationships": {
"item": {
"data": {
"type": "items",
"id": object_id
}
},
"storage": {
"data": {
"type": "objects",
"id": storage_id
}
}
}
}
}
回答1:
Your payloads are correct. To create the second version, you have to send your request to the CreateVersion endpoint.
url = '{}data/v1/projects/{}/versions'.format(self.DOMAIN, project_id)
回答2:
You must be missing a little detail that makes it not working, but since you provide so little description nobody can tell based on that ... In order to create a new version, you first need to create a new storage location, upload the file to that location, and post a new version, referencing the existing item id.
Alternatively take a look my that node js sample to upload a file and create a new item or version if the item exists.
回答3:
The data for your updating the version seems incorrect to me, Try the following steps.
- Create a new Storage location on the same folder where V1 of your file is located
- upload v2 of your file to the new storage location created on the step below.
- Get the item ID of the resource from the manifest result of your successful upload of V1 or call the following end point to obtain the ID https://developer.autodesk.com/en/docs/data/v2/reference/http/projects-project_id-folders-folder_id-contents-GET
Once you have all this information your data to pass in will look like this.
{ "jsonapi": { "version": "1.0" }, "data": { "type": "versions", "attributes": { "name": "v2File.rvt", "extension": { "type": "versions:autodesk.bim360:File", "version": "1.0"} }, "relationships": { "item": { "data": { "type": "items", "id": "urn:adsk.wipprod:dm.lineage:8jehs1iSQGu_wXpZ977bjA" } }, "storage": { "data": { "type": "objects", "id": "urn:adsk.objects:os.object:wip.dm.prod/a7fde689-62cf-49c1-9273-8df976568996.rvt" } } } } }
The only difference I can think of is your objectId is not correct. Image below is proof of both versions uploaded with the API.
来源:https://stackoverflow.com/questions/46793868/update-file-version-with-autodesk-api