How to convert curl call with “-i --upload-file” into java Unirest or any other http request?

前端 未结 3 1090
孤城傲影
孤城傲影 2020-12-18 10:46

The example below uses cURL to upload image file included as a binary file.

curl -i --upload-file /path/to/image.png --header \"Authorization: Token\" \'http         


        
相关标签:
3条回答
  • 2020-12-18 11:13

    Below method will upload the image to linkedIn

    Reference : https://docs.microsoft.com/en-us/linkedin/marketing/integrations/community-management/shares/vector-asset-api#upload-the-image

    private void uploadMedia(String uploadUrl,String accessToken) throws IOException {           
               RestTemplate restTemplate = new RestTemplate();
               HttpHeaders headers = new HttpHeaders();
               headers.add("Authorization","Bearer "+accessToken);
               byte[] fileContents = Files.readAllBytes(new 
               File("path_to_local_file").toPath());
               HttpEntity<byte[]> entity = new HttpEntity<>(fileContents, headers);
               restTemplate.exchange(uploadUrl,HttpMethod.PUT, entity, String.class);
          }
    
    0 讨论(0)
  • 2020-12-18 11:15

    I think the curl command curl -i --upload-file /path/to/image.png --header "Authorization: Token" 'https://url....'

    uses PUT while your Java client uses POST

    Source: The man page of curl.

           -T, --upload-file <file>
                  This  transfers  the  specified local file to the remote URL. If
                  there is no file part in the specified URL, Curl will append the
                  local file name. NOTE that you must use a trailing / on the last
                  directory to really prove to Curl that there is no file name  or
                  curl will think that your last directory name is the remote file
                  name to use. That will most likely cause the upload operation to
                  fail. If this is used on an HTTP(S) server, the PUT command will
                  be used.
    

    Not sure if this is the actual problem though. Your API doc link actually specifies POST.

    0 讨论(0)
  • 2020-12-18 11:25

    After several hours of banging my head against the wall, I finally figured out how to convert the curl call into a RestClient one (I'm using Ruby on Rails).

    I think the problem you're having is that you have to pass the MIME type as the Content-Type in the request headers.

    I'm using MiniMagick to figure out the MIME type of the image I'm uploading to LinkedIn. MiniMagick can also give you the binary string of the image that LinkedIn requires, so it's a win-win situation.

    This is the call that finally worked:

    file = MiniMagick::Image.open(FILE_PATH)
    RestClient.post(UPLOAD_URL, file.to_blob, { 'Authorization': 'Bearer TOKEN', 'Content-Type': file.mime_type })
    
    0 讨论(0)
提交回复
热议问题