Method: OpenApiOpenAIClient::ApiClient#download_file

Defined in:
lib/openapi_openai/api_client.rb

#download_file(request) ⇒ Tempfile

Save response body into a file in (the defined) temporary folder, using the filename from the “Content-Disposition” header if provided, otherwise a random filename. The response body is written to the file in chunks in order to handle files which size is larger than maximum Ruby String or even larger than the maximum memory a Ruby process can use.

Returns:

  • (Tempfile)

    the tempfile generated

See Also:



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/openapi_openai/api_client.rb', line 171

def download_file(request)
  tempfile = nil
  encoding = nil
  request.on_headers do |response|
    content_disposition = response.headers['Content-Disposition']
    if content_disposition && content_disposition =~ /filename=/i
      filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
      prefix = sanitize_filename(filename)
    else
      prefix = 'download-'
    end
    prefix = prefix + '-' unless prefix.end_with?('-')
    encoding = response.body.encoding
    tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
  end
  request.on_body do |chunk|
    chunk.force_encoding(encoding)
    tempfile.write(chunk)
  end
  # run the request to ensure the tempfile is created successfully before returning it
  request.run
  if tempfile
    tempfile.close
    @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
                        "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
                        "will be deleted automatically with GC. It's also recommended to delete the temp file "\
                        "explicitly with `tempfile.delete`"
  else
    fail ApiError.new("Failed to create the tempfile based on the HTTP response from the server: #{request.inspect}") 
  end

  tempfile
end