// deleteACLRule deleted the "allUsers" ACL rule for the named file. func (d *demo) deleteACLRule(fileName string) { fmt.Fprintf(d.w, "\nDelete ACL rule for file %v:\n", fileName) err := storage.DeleteACLRule(d.ctx, d.bucket, fileName, "allUsers") if err != nil { d.errorf("deleteACLRule: unable to delete ACL rule for bucket %q, file %q: %v", d.bucket, fileName, err) return } d.dumpACL(fileName) }
// Delete removes an object by name from the bucket being used. If the object does not // exist and there is nothing to delete, Delete returns with no error. // TODO Delete thumbnail and web view copies too! func Delete(filename string, r *http.Request) error { c := appengine.NewContext(r) bucket, err := file.DefaultBucketName(c) if err != nil { log.Errorf(c, "Failed to get default bucket: %v", err) return err } ctx, err := auth(r) if err != nil { log.Errorf(c, "Failed to get context: %v", err) return err } log.Infof(c, "Attempting to delete file %v from bucket %v.", filename, bucket) // StatObject is used here to check existence before calling DeleteObject. // If the object does not exist, DeleteObject returns an error that is NOT // ErrObjectNotExist, so it seemed more reliable to check with StatObject first... _, err = storage.StatObject(ctx, bucket, filename) if err == storage.ErrObjectNotExist { log.Warningf(c, "Object does not exist, nothing to delete.") return nil } err = storage.DeleteObject(ctx, bucket, filename) if err != nil { log.Errorf(c, "Failed to delete file.") log.Infof(c, "Attempting to remove public access to file...") aclErr := storage.DeleteACLRule(ctx, bucket, filename, storage.AllUsers) if aclErr != nil { log.Errorf(c, "Failed to remove public file access!") } else { log.Infof(c, "File access removed.") } return err } return nil }