BookmarkSubscribeRSS Feed
agno3
Calcite | Level 5

Hello,

 

My mission(I've chosen to accept it) is to upload a zip file (bundled up XPT files in there) to an API. I'm using the code below. The issue(s) I've run into are 

1) Is the code complete/correct  from the MULTI PART aspect ? The client is expecting a "multipart/form-data" type of upload. 

2)  Do I need the boundary to be defined, considering there are multiple xpt files in the zip file ? Currently commented out. If needed, where does it go ?

 

Some notes:

1) There is no "data size" limiting this operation.

2) Yes, the macro variables resolve correctly. Can't share that sensitive information here.

 

Thanks in advance.

AgNO3.

@ChrisHemedinger 

 


options nobomfile; filename dd_raw "../dataraw/dd_raw.zip"; /*%let boundary=%sysfunc(uuidgen());*/ proc http url = "&base_uri/repository/container/&containerAID/&version/assetgroup/&agaid/upload" method='post' in=multi (dd_raw header = "content-type: multipart/form-data", "xpt data"); debug level=3; headers 'Authorization'="Bearer &ACCESS_TOKEN"; run;

proc_http_log.PNG

3 REPLIES 3
ChrisHemedinger
Community Manager

@agno3 ,

 

I would first try without any special options, using just POST with the ZIP file as the IN= payload. If that doesn't do the trick, see the MULTI option on PROC HTTP (documentation). Your example doesn't look like valid syntax to me.

 

Or, See if the example here helps with the task. This workaround was the trick to use before there was a MULTI option, I think.

 

 

Register for SAS Innovate 2025!! The premier event for SAS users, May 6-9 in Orlando FL. Sign up now for the best deals!
agno3
Calcite | Level 5

Thanks for your reply. 

 

Unfortunately, neither avenues have gotten me the intended result.

As for the example you pointed out to.  the PROC ends in a "Bad Request". Below is my entire code, and the log snippet. Please see the "error:"invalid_files " message. FYI - I've tried this with 4 different files - XPT,XLSX,SAS7BDAT and a ZIP file. All of them yield the same error message. And yes, these files do have ample data in them. log_snip.PNG

 

%let boundary=%sysfunc(uuidgen()); 
filename input1 "../dataraw/f_ae_003.xpt";

%let updestfile = f_ae_003;

data _null_;
    infile request end=eof;
    file input1;

      if _n_ = 1 then do;
        put "--&boundary"; 
        put 'Content-Disposition: form-data; name="attributes"';
        put ;
        put '{"name":"' "&updestfile" '", "parent":{"id":"' "folderID" '"}}';
        put "--&boundary"; 
        put 'Content-Disposition: form-data; name="file"; filename="' "&updestfile" '"';

        put "Content-Type: application/ASCII";
/*        put "Content-Type: application/octet-stream";*/
        put ;
      end;

    input;
    put _infile_;

    if eof then
     do;
       put "--&boundary--"; 
     end;
  run;

  data _null_;
    file input1 mod recfm=f lrecl=1;
    infile request  recfm=f lrecl=1;
    
    input;
    put _infile_;
run;


  *---------------------------------------------------------------------------------------;
  *>> Determine size of request and store in macro variable  *****************************;
  *---------------------------------------------------------------------------------------;
  data _null_;
    length bytes $1024;
    fid = fopen("input1");
    rc = fread(fid);
    bytes = finfo(fid, 'File Size (bytes)');
    call symput("FileSize",trim(bytes));
    rc = fclose(fid);
    put bytes;
  run;

  *---------------------------------------------------------------------------------------;
  *>> Submit the Upload request to Box  **************************************************;
  *---------------------------------------------------------------------------------------;
  proc http
      url=  "&base_uri/repository/container/&containerAID/&version/assetgroup/&agaid/upload"
        method    = "POST"
        out       = resp
        headerout = headout
        in        = input1
        ct        = "multipart/form-data; boundary=&boundary"
    ;
    headers
      "Authorization"  = "Bearer &ACCESS_TOKEN"
      "Content-Length" = "&filesize"
    ;
	debug level=3;

  run;

As for the SAS documentation link, something seems off (atleast to me) as word POST is not wrapped in quotes. And even when I add quotes, it doesnt "finish" running...

 

documentation_example_log.PNG

 

Help here will be abundantly appreciated.

thanks.

ChrisHemedinger
Community Manager

I usually start with the API documentation, which often has examples that use cURL or another language. From there it's simple to transcribe to the equivalent in SAS PROC HTTP. Is there doc for the API? I understand your data is sensitive, but is the system you're using a well-known service?

Register for SAS Innovate 2025!! The premier event for SAS users, May 6-9 in Orlando FL. Sign up now for the best deals!

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 1269 views
  • 0 likes
  • 2 in conversation