def create(mime_type='application/octet-stream', _blobinfo_uploaded_filename=None): """Create a writable blobstore file. Args: mime_type: Resulting blob content MIME type as string. _blobinfo_uploaded_filename: Resulting blob's BlobInfo file name as string. Returns: A file name for blobstore file. This file can be opened for write by File API open function. To read the file or obtain its blob key, finalize it and call get_blob_key function. """ if not mime_type: raise files.InvalidArgumentError('Empty mime_type') if not isinstance(mime_type, basestring): raise files.InvalidArgumentError('Expected string for mime_type') params = {_MIME_TYPE_PARAMETER: mime_type} if _blobinfo_uploaded_filename: if not isinstance(_blobinfo_uploaded_filename, basestring): raise files.InvalidArgumentError( 'Expected string for _blobinfo_uploaded_filename') params[ _BLOBINFO_UPLOADED_FILENAME_PARAMETER] = _blobinfo_uploaded_filename return files._create(_BLOBSTORE_FILESYSTEM, params=params)
def get_blob_key(create_file_name): """Get a blob key for finalized blobstore file. Args: create_file_name: Writable blobstore filename as obtained from create() function. The file should be finalized. Returns: An instance of apphosting.ext.blobstore.BlobKey for corresponding blob or None if the blob referred to by the file name is not finalized. Raises: mapreduce.lib.files.InvalidFileNameError if the file name is not a valid nonfinalized blob file name. """ if not create_file_name: raise files.InvalidArgumentError('Empty file name') if not isinstance(create_file_name, basestring): raise files.InvalidArgumentError('Expected string for file name') if not create_file_name.startswith(_BLOBSTORE_DIRECTORY): raise file.InvalidFileNameError( 'Filename %s passed to get_blob_key doesn\'t have prefix %s' % (create_file_name, _BLOBSTORE_DIRECTORY)) ticket = create_file_name[len(_BLOBSTORE_DIRECTORY):] if not ticket.startswith(_CREATION_HANDLE_PREFIX): return blobstore.BlobKey(ticket) query = datastore.Query(blobstore.BLOB_INFO_KIND, {'creation_handle =': ticket}, keys_only=True) results = query.Get(1) if not results: return None return blobstore.BlobKey(results[0].name())
def get_file_name(blob_key): """Get a filename to read from the blob. Args: blob_key: An instance of BlobKey. Returns: File name as string which can be used with File API to read the file. """ if not blob_key: raise files.InvalidArgumentError('Empty blob key') if not isinstance(blob_key, (blobstore.BlobKey, basestring)): raise files.InvalidArgumentError( 'Expected string or blobstore.BlobKey') return '%s%s' % (_BLOBSTORE_DIRECTORY, blob_key)
def create(filename, mime_type='application/octet-stream', acl=None, cache_control=None, content_encoding=None, content_disposition=None, user_metadata=None): """Create a writable googlestore file. Args: filename: Google Storage object name (/gs/bucket/object) mime_type: Blob content MIME type as string. acl: Canned acl to apply to the object as per: http://code.google.com/apis/storage/docs/reference-headers.html#xgoogacl If not specified (or set to None), default object acl is used. cache_control: Cache control header to set when serving through Google storage. If not specified, default of 3600 seconds is used. content_encoding: If object is compressed, specify the compression method here to set the header correctly when served through Google Storage. content_disposition: Header to use when serving through Google Storage. user_metadata: Dictionary specifying key value pairs to apply to the object. Each key is prefixed with x-goog-meta- when served through Google Storage. Returns: A writable file name for a Google Storage file. This file can be opened for write by File API open function. To read the file call file::open with the plain Google Storage filename (/gs/bucket/object). """ if not filename: raise files.InvalidArgumentError('Empty filename') elif not isinstance(filename, basestring): raise files.InvalidArgumentError('Expected string for filename', filename) elif not filename.startswith(_GS_PREFIX) or filename == _GS_PREFIX: raise files.InvalidArgumentError( 'Google storage files must be of the form /gs/bucket/object', filename) elif not mime_type: raise files.InvalidArgumentError('Empty mime_type') elif not isinstance(mime_type, basestring): raise files.InvalidArgumentError('Expected string for mime_type', mime_type) params = {_MIME_TYPE_PARAMETER: mime_type} if acl: if not isinstance(acl, basestring): raise files.InvalidArgumentError('Expected string for acl', acl) params[_CANNED_ACL_PARAMETER] = acl if content_encoding: if not isinstance(content_encoding, basestring): raise files.InvalidArgumentError( 'Expected string for content_encoding') else: params[_CONTENT_ENCODING_PARAMETER] = content_encoding if content_disposition: if not isinstance(content_disposition, basestring): raise files.InvalidArgumentError( 'Expected string for content_disposition') else: params[_CONTENT_DISPOSITION_PARAMETER] = content_disposition if cache_control: if not isinstance(cache_control, basestring): raise files.InvalidArgumentError( 'Expected string for cache_control') else: params[_CACHE_CONTROL_PARAMETER] = cache_control if user_metadata: if not isinstance(user_metadata, dict): raise files.InvalidArgumentError('Expected dict for user_metadata') for key, value in user_metadata.items(): if not isinstance(key, basestring): raise files.InvalidArgumentError( 'Expected string for key in user_metadata') if not isinstance(value, basestring): raise files.InvalidArgumentError( 'Expected string for value in user_metadata for key: ', key) params[_USER_METADATA_PREFIX + key] = value return files._create(_GS_FILESYSTEM, filename=filename, params=params)