Bot

파일 업로드 문의드립니다.

마인테크

2023.01.23읽음 1000

c# 으로 메세지방에 파일 업로드 하는 부분을 구현 중에 문의 드립니다.
메세지 방에 파일을 업로드 하기 위해서 대략 아래와 같은 소스를 작성했습니다.
네이버웍스 측에서 업로드 경로를 얻어오는 부분까지는 잘 됩니다.

이후 실제 업로드를 진행하는 과정에서 파라미터를 어떻게 설정해야 하는지 잘 몰라 문의 드립니다.
아래 소스 코드처럼 실행할 경우 서버응답코드(response1.StatusCode)는 0 이고 수신되는 값(response1.Content)은 없습니다.(null)
어떤게 잘못 되었을까요?
           apiUrl = $"https://www.worksapis.com/v1.0/bots/{botId}/attachments";  
           string fileName = Path.GetFileName(fileFullName);
           string filePathOnly = Path.GetDirectoryName(fileFullName);
           var msg = new FileUploadReq
           {
               fileName = $"{fileName}",
               fileSize = fileSize
           };
           var body = System.Text.Json.JsonSerializer.Serialize(msg);
           var client = new RestClient();
           var request = new RestRequest(apiUrl, Method.Post);
           request.AddHeader("Authorization", "Bearer " + accessToken);
           request.AddHeader("Content-Type", "application/json");
           request.AddParameter("application/json", body, ParameterType.RequestBody);
           var response = client.Execute(request);

           var fileUploadRes = System.Text.Json.JsonSerializer.Deserialize<FileUploadRes>(response.Content);
           string uploadUrl = fileUploadRes.uploadUrl;   // 파일 업로드 경로
//-------------------------------------------------------------------------------------------------
           string boundary = Guid.NewGuid().ToString();
           byte[] fileBytes;
           using (FileStream fs = File.Open(fileFullName, FileMode.Open))
           {
               fileBytes = new BinaryReader(fs).ReadBytes((int)fs.Length);
           }
           // 실제 업로드 진행
           var request1 = new RestRequest(uploadUrl, Method.Post);
           request1.AddHeader("Authorization", $"Bearer {accessToken}");
           request1.AddHeader("Content-Length", 223);
           request1.AddHeader("Content-Type", $"multipart/form-data; boundary=\"{boundary}\"");
           var response1 = client.Execute(request1);
           MyDebug("FileUpload2[response1.StatusCode]:" + response1.StatusCode);
           MyDebug("FileUpload2[response1.Content]:" + response1.Content);

댓글2

  • 업데이트 된 답글입니다.

    마인테크 작성자

    자답입니다.
    약간 찜찝하지만 실제 업로드 진행 부분의 소스를 다음처럼 수정해서 업로드에 대한 결과는 잘 회신됩니다.

               // 실제 업로드 진행
               var webClient = new WebClient();
               webClient.Headers.Add("Authorization", $"Bearer {accessToken}");
               webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
               var fileData = webClient.Encoding.GetString(fileBytes);
               var package = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n{3}\r\n--{0}--\r\n", boundary, fileName, mimeType, fileData);

               var nfile = webClient.Encoding.GetBytes(package);


               byte[] resp = webClient.UploadData(uploadUrl, "POST", nfile);

               string s = webClient.Encoding.GetString(resp);
               var fileUploadCompleteRes = System.Text.Json.JsonSerializer.Deserialize<FileUploadCompleteRes>(s);

               string fileId = fileUploadCompleteRes.fileId;
               string fileName2 = fileUploadCompleteRes.fileName;
               long fileSize2 = fileUploadCompleteRes.fileSize;

    2023.01.24

    0
  • 업데이트 된 답글입니다.

    bsw2428

    해결되었다니 다행이네요.
    아래 가이드를 참고하면 좋을 것 같아요.
    https://developers.worksmobile.com/kr/reference/file-upload?lang=ko

    2023.01.25

    0
이전 글앱을 만들어서 사용할 때 질문드립니다.
다음 글파이썬 메세지 봇 callback 메세지 X-WORKS-Signature
목록

궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!