Ejemplo n.º 1
0
 protected function putFile(File $file, $locationUri)
 {
     try {
         $response = $this->api->request($locationUri, 'PUT', ['Content-Type' => 'text/csv', 'Content-Length' => $file->getSize()], ['body' => \GuzzleHttp\Psr7\stream_for(fopen($file->getPathname(), 'r'))]);
     } catch (BadResponseException $e) {
         $response = $e->getResponse();
         if ($response->getStatusCode() >= 300) {
             // get upload status
             $response = $this->api->request($locationUri, 'PUT', ['Content-Type' => 'text/csv', 'Content-Length' => 0, 'Content-Range' => 'bytes */*']);
             $i = 0;
             $maxTries = 7;
             while ($response->getStatusCode() == 308 && $i < $maxTries) {
                 $range = explode('-', $response->getHeaderLine('Range'));
                 $remainingSize = $file->getSize() - $range[1] + 1;
                 // ffwd to byte where we left of
                 $fh = fopen($file->getPathname(), 'r');
                 fseek($fh, $range[1] + 1);
                 $response = $this->api->request($locationUri, 'PUT', ['Content-Length' => $remainingSize, 'Content-Range' => sprintf('bytes %s/%s', $range[1] + 1, $file->getSize())], ['body' => \GuzzleHttp\Psr7\stream_for($fh)]);
                 sleep(pow(2, $i));
                 $i++;
             }
         }
     }
     if ($response->getStatusCode() >= 300) {
         throw new ApplicationException("Error on PUT file", null, ['statusCode' => $response->getStatusCode(), 'reason' => $response->getReasonPhrase(), 'responseBody' => $response->getBody()]);
     }
     return json_decode($response->getBody(), true);
 }