Как отправить вложение в поле BIM 360 через Flurl MultipartFormDataContent - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь загрузить приложение к проблеме в BIM 360 Field приложением (.NET Framework).Я использую следующую конечную точку (BIM 360 Field API Doc: https://bim360field.autodesk.com/apidoc/index.html#mobile_api_method_21).

Для построения запроса я использую Flurl и MultipartFormDataContent (см. Код ниже)Однако я получаю 500 Internal Server Error назад и, к сожалению, нет более конкретной информации, что именно пошло не так.

Я пытался загрузить вложение с точно таким же url,галочка, project_id и 'строка сведений о вложении' через почтальон , и все работало нормально.

код:

byte[] fileByteArray = memoryStream.ToArray();
string attachment = JsonConvert.SerializeObject(attachmentDetails);

MultipartFormDataContent conntent = new MultipartFormDataContent();
conntent.Add(new ByteArrayContent(fileByteArray, 0, fileByteArray.Length), "original");
conntent.Add(new StringContent(attachment), "attachment");

FlurlClient client = fieldConnection.GetClient("attachments");
client.Url.SetQueryParam("ticket", Ticket);
client.Url.SetQueryParam("project_id", project);

return await client
             .WithTimeout(30)
             .SendAsync(HttpMethod.Post, conntent)
             .ConfigureAwait(false);

Я ожидаюесть проблема с моим MultipartFormDataContent . Я что-то упустил?

С уважением

Крис

1 Ответ

1 голос
/ 06 июня 2019

Кажется, это проблема библиотеки Flurl ( ref ), и она всегда не может опубликовать нужный контент. В любом случае, вот рабочий фрагмент кода для игры с Flurl. Надеюсь, это поможет!

КСТАТИ

это API для части классического BIM360 Field, и оно не является частью платформы Forge. Поэтому, пожалуйста, оставляйте свои вопросы на https://forums.autodesk.com/t5/bim-360-api-forum/bd-p/115, Спасибо!

 public static HttpResponseMessage AttachmentsByFlurl(string ticket, string project_id,
            string originalPath, string thumbPath,
            string container_id, string container_type)
        {
            // Compose Attachment JSON string 
            FileInfo original = new FileInfo(originalPath);
            Dictionary<string, string> att = new Dictionary<string, string>();

            // date time format: "2015-08-05 15:28:17 -0500";
            string dateTimeFormat = "yyyy-MM-dd HH:mm:ss zzz";
            string curTime = DateTime.Now.ToString(dateTimeFormat);
            att["fcreate_date"] = original.CreationTime.ToString(dateTimeFormat);
            att["fmod_date"] = original.LastWriteTime.ToString(dateTimeFormat);
            att["created_at"] = curTime;
            att["updated_at"] = curTime;

            att["size"] = original.Length.ToString();
            att["content_type"] = MimeMapping.GetMimeMapping(original.Name);
            att["filename"] = original.Name;
            att["container_id"] = container_id;     // e.g., issue_id 
            att["container_type"] = container_type; // e.g., "Issue" 

            // Conver to JSON format
            string attachment = Newtonsoft.Json.JsonConvert.SerializeObject(att);

            var mpc = new MultipartContent();
            var ticketContent = new StringContent(ticket);
            ticketContent.Headers.Add("Content-Disposition", "form-data; name=\"ticket\"");
            mpc.Add(ticketContent);

            var projectIdContent = new StringContent(project_id);
            projectIdContent.Headers.Add("Content-Disposition", "form-data; name=\"project_id\"");
            mpc.Add(projectIdContent);

            var attachmentContent = new StringContent(attachment, Encoding.UTF8, "application/json");
            attachmentContent.Headers.Add("Content-Disposition", "form-data; name=\"attachment\"");
            mpc.Add(attachmentContent);

            var attachmentFileStream = File.OpenRead(originalPath);
            var attachmentContentStream = new StreamContent(attachmentFileStream);
            attachmentContentStream.Headers.Add("Content-Disposition", string.Format("form-data; name=\"original\"; filename=\"{0}\"", Path.GetFileName(originalPath)));
            mpc.Add(attachmentContentStream);

            if(!string.IsNullOrEmpty(thumbPath))
            {
                var thumbFileStream = File.OpenRead(thumbPath);
                var thumbContentStream = new StreamContent(thumbFileStream);
                thumbContentStream.Headers.Add("Content-Disposition", string.Format("form-data; name=\"thumb\"; filename=\"{0}\"", Path.GetFileName(thumbPath)));
                mpc.Add(thumbContentStream);
            }

            var url = "https://bim360field.autodesk.com/api/attachments";
            var resp = url
                        .PostAsync(mpc)
                        .Result;

            return resp;
        }
...